{"title":"Zaawansowany tutorial: Jak pisać aplikacje wielokrotnego użytku","version":"2.0","locale":"pl","docname":"intro/reusable-apps","url":"/pl/2.0/intro/reusable-apps/","canonical":"https://djangodocs.dev/pl/2.0/intro/reusable-apps/","summary":"Ten tutorial dla zaawansowanych zaczyna się, gdzie Tutorial 7 się skończył. Będziemy przerabiać naszą web-ankietę na samodzielny pakiet Pythona, który będziesz mógł…","html":"<h1>Zaawansowany tutorial: Jak pisać aplikacje wielokrotnego użytku<a class=\"heading-anchor\" href=\"#advanced-tutorial-how-to-write-reusable-apps\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Ten tutorial dla zaawansowanych zaczyna się, gdzie <a class=\"reference internal\" href=\"/pl/2.0/intro/tutorial07/\"><span class=\"doc\">Tutorial 7</span></a> się skończył. Będziemy przerabiać naszą web-ankietę na samodzielny pakiet Pythona, który będziesz mógł wykorzystać w nowym projekcie i którym będziesz mógł podzielić się z innymi.</p>\n<p>Jeśli nie ukończyłeś niedawno Tutoriali 1–7, zachęcamy cię do powtórzenia ich, aby twój przykładowy projekt pasował do tego opisanego poniżej.</p>\n<section id=\"reusability-matters\">\n<h2>Możliwość ponownego użycia ma znaczenie<a class=\"heading-anchor\" href=\"#reusability-matters\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Zaprojektować, zbudować, przetestować i utrzymywać aplikację webową to bardzo dużo pracy. Wiele projektów w Pythonie i Django napotyka wspólne problemy. Czy nie byłoby super, jeśli moglibyśmy oszczędzić części tej powtarzanej pracy?</p>\n<p>Reusability is the way of life in Python. <a class=\"reference external\" href=\"https://pypi.org/\">The Python Package Index (PyPI)</a> has a vast range of packages you can use in your own\nPython programs. Check out <a class=\"reference external\" href=\"https://djangopackages.org\">Django Packages</a> for\nexisting reusable apps you could incorporate in your project. Django itself is\nalso just a Python package. This means that you can take existing Python\npackages or Django apps and compose them into your own web project. You only\nneed to write the parts that make your project unique.</p>\n<p>Powiedzmy, że zaczynałeś nowy projekt, który potrzebował aplikacji z ankietą, takiej jak ta, nad którą pracowaliśmy. Jak uczynić tą aplikację gotową do wykorzystania przez innych? Na szczęście, jesteśmy już na dobrej drodze. W <a class=\"reference internal\" href=\"/pl/2.0/intro/tutorial03/\"><span class=\"doc\">Tutorialu 3</span></a> widzieliśmy jak możemy wydzielić ankiety z URLconfa na poziomie projektu przez użycie <code class=\"docutils literal notranslate\"><span class=\"pre\">include</span></code>. W tym tutorialu poczynimy dalsze kroki, aby uczynić aplikację łatwą do użycia w nowych projektach i gotową do publikacji, aby inni mogli ją zainstalować i używać.</p>\n<aside class=\"admonition-package-app admonition\">\n<p class=\"admonition-title\">Pakiet? Aplikacja?</p>\n<p>Pythonowy <a class=\"reference external\" href=\"https://docs.python.org/3/glossary.html#term-package\" title=\"(w Python v3.14)\"><span class=\"xref std std-term\">package</span></a> jest sposobem na zgrupowanie związanego kodu Pythona na potrzeby łatwego ponownego użycia. Pakiet zawiera jeden lub więcej plików z kodem Pythona (znane także jako „moduły”).</p>\n<p>Pakiet można zaimportować przez <code class=\"docutils literal notranslate\"><span class=\"pre\">import</span> <span class=\"pre\">foo.bar</span></code> lub <code class=\"docutils literal notranslate\"><span class=\"pre\">from</span> <span class=\"pre\">foo</span> <span class=\"pre\">import</span> <span class=\"pre\">bar</span></code>. Aby katalog (jak <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code>) stał się pakietem, musi zawierać specjalny plik <code class=\"docutils literal notranslate\"><span class=\"pre\">__init__.py</span></code>, który może być pusty.</p>\n<p><em>Aplikacja</em> Django jest tylko pakietem Pythona, który jest szczególnie przeznaczony do użycia w projekcie Django. Aplikacja może używać powszechnych w Django konwencji, jak posiadanie podmodułów <code class=\"docutils literal notranslate\"><span class=\"pre\">models</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">tests</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">urls</span></code> i <code class=\"docutils literal notranslate\"><span class=\"pre\">views</span></code>.</p>\n<p>Dalej będziemy używać pojęcia <em>pakietowanie</em>, aby opisać proces robienia pakietu Pythona łatwego do instalacji dla innych. Mamy świadomość, że może to być nieco mylące.</p>\n</aside>\n</section>\n<section id=\"your-project-and-your-reusable-app\">\n<h2>Twój projekt i twoja aplikacja do ponownego wykorzystania<a class=\"heading-anchor\" href=\"#your-project-and-your-reusable-app\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Po poprzednich tutorialach, nasz projekt powinien wyglądać tak:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">mysite</span><span class=\"o\">/</span>\n    <span class=\"n\">manage</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">mysite</span><span class=\"o\">/</span>\n        <span class=\"fm\">__init__</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">urls</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">wsgi</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">polls</span><span class=\"o\">/</span>\n        <span class=\"fm\">__init__</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">admin</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">migrations</span><span class=\"o\">/</span>\n            <span class=\"fm\">__init__</span><span class=\"o\">.</span><span class=\"n\">py</span>\n            <span class=\"mi\">0001</span><span class=\"n\">_initial</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">static</span><span class=\"o\">/</span>\n            <span class=\"n\">polls</span><span class=\"o\">/</span>\n                <span class=\"n\">images</span><span class=\"o\">/</span>\n                    <span class=\"n\">background</span><span class=\"o\">.</span><span class=\"n\">gif</span>\n                <span class=\"n\">style</span><span class=\"o\">.</span><span class=\"n\">css</span>\n        <span class=\"n\">templates</span><span class=\"o\">/</span>\n            <span class=\"n\">polls</span><span class=\"o\">/</span>\n                <span class=\"n\">detail</span><span class=\"o\">.</span><span class=\"n\">html</span>\n                <span class=\"n\">index</span><span class=\"o\">.</span><span class=\"n\">html</span>\n                <span class=\"n\">results</span><span class=\"o\">.</span><span class=\"n\">html</span>\n        <span class=\"n\">tests</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">urls</span><span class=\"o\">.</span><span class=\"n\">py</span>\n        <span class=\"n\">views</span><span class=\"o\">.</span><span class=\"n\">py</span>\n    <span class=\"n\">templates</span><span class=\"o\">/</span>\n        <span class=\"n\">admin</span><span class=\"o\">/</span>\n            <span class=\"n\">base_site</span><span class=\"o\">.</span><span class=\"n\">html</span>\n</code></pre></div>\n<p>Stworzyłeś <code class=\"docutils literal notranslate\"><span class=\"pre\">mysite/templates</span></code> w <a class=\"reference internal\" href=\"/pl/2.0/intro/tutorial07/\"><span class=\"doc\">Tutorialu 7</span></a> i <code class=\"docutils literal notranslate\"><span class=\"pre\">polls/templates</span></code> w <a class=\"reference internal\" href=\"/pl/2.0/intro/tutorial03/\"><span class=\"doc\">Tutorialu 3</span></a>. Teraz prawdopodobnie jest jaśniejsze dlaczego postanowiliśmy mieć osobne katalogi szablonów dla projektu i aplikacji: wszystko, co jest częścią aplikacji ankietowej jest w <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code>. To powoduje, że aplikacja jest w jednym kawałku i prościej ją wrzucić w nowy projekt.</p>\n<p>Katalog <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> mógłby być teraz skopiowany do nowego projektu Django i od razu użyty. Ale nie jest zupełnie gotowy do bycia opublikowanym. Na tę potrzebę, musimy spakować naszą aplikację, aby ułatwić innym jej instalację.</p>\n</section>\n<section id=\"installing-some-prerequisites\">\n<span id=\"installing-reusable-apps-prerequisites\"></span><h2>Instalowanie narzędzi<a class=\"heading-anchor\" href=\"#installing-some-prerequisites\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Bieżący stan pakietowania w Pythonie jest nieco zagmatwany przez wiele narzędzi. Na potrzeby tego tutorialu, użyjemy <a class=\"reference external\" href=\"https://pypi.org/project/setuptools/\">setuptools</a>, aby zbudować nasz pakiet. Są one zalecanym narzędziem pakietowania (zmergowane z forkiem <code class=\"docutils literal notranslate\"><span class=\"pre\">distribute</span></code>). Będziemy też używać <a class=\"reference external\" href=\"https://pypi.org/project/pip/\">pipa</a>, aby go zainstalować i odinstalować. Powinieneś teraz zainstalować te dwa pakiety. Jeśli potrzebujesz pomocy, możesz zajrzeć do <a class=\"reference internal\" href=\"/pl/2.0/topics/install/#installing-official-release\"><span class=\"std std-ref\">jak zainstalować Django używając pipa</span></a>. W ten sam sposób możesz zainstalować <code class=\"docutils literal notranslate\"><span class=\"pre\">setuptools</span></code>.</p>\n</section>\n<section id=\"packaging-your-app\">\n<h2>Pakowanie twojej aplikacji<a class=\"heading-anchor\" href=\"#packaging-your-app\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Pythonowe <em>pakietowanie</em> oznacza przygotowane twojej aplikacji w określonym formacie, który będzie mógł być prosto zainstalowany i użyty. Samo Django jest zapakowane właśnie w ten sposób. Dla małej aplikacji jak ankiety, ten proces nie jest zbyt skomplikowany.</p>\n<ol class=\"arabic\">\n<li><p>Najpierw stwórz katalog nadrzędny dla <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code>, poza swoim projektem Django. Nazwij ten katalog <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code>.</p>\n<aside class=\"admonition-choosing-a-name-for-your-app admonition\">\n<p class=\"admonition-title\">Wybór nazwy dla twojej aplikacji</p>\n<p>Wybierają nazwę dla swojego pakietu, sprawdź miejsca takie jak PyPI, aby uniknąć konfliktu nazw z istniejącymi pakietami. Często przydaje się dodać <code class=\"docutils literal notranslate\"><span class=\"pre\">django-</span></code> to nazwy twojego modułu tworząc pakiet do dystrybucji. To pomaga innym szukającym aplikacje Django rozróżnić twoją aplikację jako djangową.</p>\n<p>Etykiety aplikacji (czyli ostatnia część kropkowanej ścieżki do pakietów aplikacji) <em>musi</em> być unikalna w <a class=\"reference internal\" href=\"/pl/2.0/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">INSTALLED_APPS</span></code></a>. Unikaj używania takich samych etykiet jak którykolwiek z <a class=\"reference internal\" href=\"/pl/2.0/ref/contrib/\"><span class=\"doc\">pakietów contrib</span></a>, na przykład <code class=\"docutils literal notranslate\"><span class=\"pre\">auth</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">admin</span></code> lub <code class=\"docutils literal notranslate\"><span class=\"pre\">messages</span></code>.</p>\n</aside>\n</li>\n<li><p>Przenieś katalog <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> do katalogu <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code>.</p></li>\n<li><p>Stwórz plik <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/README.rst</span></code> o następującej treści:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>django-polls/README.rst</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"django-polls/README.rst\"><code>=====\nPolls\n=====\n\nPolls is a simple Django app to conduct Web-based polls. For each\nquestion, visitors can choose between a fixed number of answers.\n\nDetailed documentation is in the &quot;docs&quot; directory.\n\nQuick start\n-----------\n\n1. Add &quot;polls&quot; to your INSTALLED_APPS setting like this::\n\n    INSTALLED_APPS = [\n        ...\n        &#39;polls&#39;,\n    ]\n\n2. Include the polls URLconf in your project urls.py like this::\n\n    path(&#39;polls/&#39;, include(&#39;polls.urls&#39;)),\n\n3. Run `python manage.py migrate` to create the polls models.\n\n4. Start the development server and visit http://127.0.0.1:8000/admin/\n   to create a poll (you&#39;ll need the Admin app enabled).\n\n5. Visit http://127.0.0.1:8000/polls/ to participate in the poll.\n</code></pre></figure>\n</li>\n<li><p>Stwórz plik <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/LICENSE</span></code>. Wybór licencji jest poza zakresem tego tutorialu, ale wystarczy powiedzieć, że kod wydany publicznie bez licencji jest <em>bezużyteczny</em>. Django i wiele kompatybilnych z Django aplikacji są rozpowszechniane na licencji BSD, aczkolwiek ty możesz wybrać swoją własną licencję. Bądź tylko świadom, że wybór licencji będzie miał wpływ na to, kto może używać twój kod.</p></li>\n<li><p>Następnie stworzymy plik <code class=\"docutils literal notranslate\"><span class=\"pre\">setup.py</span></code>, który zawiera szczegóły jak zbudować i zainstalować aplikację. Pełne wytłumaczenie tego pliku nie należy do tego tutorialu, ale <a class=\"reference external\" href=\"https://setuptools.readthedocs.io/en/latest/\">dokumentacja setuptools</a> ma dobre tłumaczenie. Stwórz plik <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/setup.py</span></code> z następującą treścią:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>django-polls/setup.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"django-polls/setup.py\"><code><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">os</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">setuptools</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">find_packages</span><span class=\"p\">,</span> <span class=\"n\">setup</span>\n\n<span class=\"k\">with</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">dirname</span><span class=\"p\">(</span><span class=\"vm\">__file__</span><span class=\"p\">),</span> <span class=\"s1\">&#39;README.rst&#39;</span><span class=\"p\">))</span> <span class=\"k\">as</span> <span class=\"n\">readme</span><span class=\"p\">:</span>\n    <span class=\"n\">README</span> <span class=\"o\">=</span> <span class=\"n\">readme</span><span class=\"o\">.</span><span class=\"n\">read</span><span class=\"p\">()</span>\n\n<span class=\"c1\"># allow setup.py to be run from any path</span>\n<span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">chdir</span><span class=\"p\">(</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">normpath</span><span class=\"p\">(</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">abspath</span><span class=\"p\">(</span><span class=\"vm\">__file__</span><span class=\"p\">),</span> <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">pardir</span><span class=\"p\">)))</span>\n\n<span class=\"n\">setup</span><span class=\"p\">(</span>\n    <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s1\">&#39;django-polls&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">version</span><span class=\"o\">=</span><span class=\"s1\">&#39;0.1&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">packages</span><span class=\"o\">=</span><span class=\"n\">find_packages</span><span class=\"p\">(),</span>\n    <span class=\"n\">include_package_data</span><span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n    <span class=\"n\">license</span><span class=\"o\">=</span><span class=\"s1\">&#39;BSD License&#39;</span><span class=\"p\">,</span>  <span class=\"c1\"># example license</span>\n    <span class=\"n\">description</span><span class=\"o\">=</span><span class=\"s1\">&#39;A simple Django app to conduct Web-based polls.&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">long_description</span><span class=\"o\">=</span><span class=\"n\">README</span><span class=\"p\">,</span>\n    <span class=\"n\">url</span><span class=\"o\">=</span><span class=\"s1\">&#39;https://www.example.com/&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">author</span><span class=\"o\">=</span><span class=\"s1\">&#39;Your Name&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">author_email</span><span class=\"o\">=</span><span class=\"s1\">&#39;yourname@example.com&#39;</span><span class=\"p\">,</span>\n    <span class=\"n\">classifiers</span><span class=\"o\">=</span><span class=\"p\">[</span>\n        <span class=\"s1\">&#39;Environment :: Web Environment&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Framework :: Django&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Framework :: Django :: X.Y&#39;</span><span class=\"p\">,</span>  <span class=\"c1\"># replace &quot;X.Y&quot; as appropriate</span>\n        <span class=\"s1\">&#39;Intended Audience :: Developers&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;License :: OSI Approved :: BSD License&#39;</span><span class=\"p\">,</span>  <span class=\"c1\"># example license</span>\n        <span class=\"s1\">&#39;Operating System :: OS Independent&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Programming Language :: Python&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Programming Language :: Python :: 3.5&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Programming Language :: Python :: 3.6&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Topic :: Internet :: WWW/HTTP&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Topic :: Internet :: WWW/HTTP :: Dynamic Content&#39;</span><span class=\"p\">,</span>\n    <span class=\"p\">],</span>\n<span class=\"p\">)</span>\n</code></pre></figure>\n</li>\n<li><p>Domyślnie tylko pythonowe moduły i pakiety zawierają się w pakiecie. Aby zawrzeć dodatkowe pliki, musimy stworzyć plik <code class=\"docutils literal notranslate\"><span class=\"pre\">MANIFEST.in</span></code>. Dokumentacja setuptools, do której odsyłaliśmy w poprzednim punkcie opisuje ten plik w szczegółach. Aby zawrzeć szablony, pliki <code class=\"docutils literal notranslate\"><span class=\"pre\">README.rst</span></code> i <code class=\"docutils literal notranslate\"><span class=\"pre\">LICENSE</span></code>, stwórz plik <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/MANIFEST.in</span></code> o następującej treści:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>django-polls/MANIFEST.in</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"django-polls/MANIFEST.in\"><code><span class=\"n\">include</span> <span class=\"n\">LICENSE</span>\n<span class=\"n\">include</span> <span class=\"n\">README</span><span class=\"o\">.</span><span class=\"n\">rst</span>\n<span class=\"n\">recursive</span><span class=\"o\">-</span><span class=\"n\">include</span> <span class=\"n\">polls</span><span class=\"o\">/</span><span class=\"n\">static</span> <span class=\"o\">*</span>\n<span class=\"n\">recursive</span><span class=\"o\">-</span><span class=\"n\">include</span> <span class=\"n\">polls</span><span class=\"o\">/</span><span class=\"n\">templates</span> <span class=\"o\">*</span>\n</code></pre></figure>\n</li>\n<li><p>Opcjonalne, ale zalecane, jest zawarcie szczegółowej dokumentacji w twojej aplikacji. Stwórz pusty katalog <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/docs</span></code> na przyszłą dokumentację. Dodaj nową linię w <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls/MANIFEST.in</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">recursive</span><span class=\"o\">-</span><span class=\"n\">include</span> <span class=\"n\">docs</span> <span class=\"o\">*</span>\n</code></pre></div>\n<p>Zwróć uwagę, że katalog <code class=\"docutils literal notranslate\"><span class=\"pre\">docs</span></code> nie zostanie zawarty w twoim pakiecie dopóki nie dodasz do niego jakichś plików. Wiele aplikacji Django dostarcza swoją dokumentację online przez strony takie jak <a class=\"reference external\" href=\"https://readthedocs.org\">readthedocs.org</a>.</p>\n</li>\n<li><p>Spróbuj zbudować swój pakiet używając <code class=\"docutils literal notranslate\"><span class=\"pre\">python</span> <span class=\"pre\">setup.py</span> <span class=\"pre\">sdist</span></code> (uruchom z wnętrza <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code>). Stworzy to katalog o nazwie <code class=\"docutils literal notranslate\"><span class=\"pre\">dist</span></code> i zbuduje twój nowy pakiet, <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls-0.1.tar.gz</span></code>.</p></li>\n</ol>\n<p>Aby dowiedzieć się więcej na temat pakowania, zobacz <a class=\"reference external\" href=\"https://packaging.python.org/distributing/\">Tutorial on Packaging and Distributing Projects</a> Pythona.</p>\n</section>\n<section id=\"using-your-own-package\">\n<h2>Używanie twojego własnego pakietu<a class=\"heading-anchor\" href=\"#using-your-own-package\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Odkąd przenieśliśmy katalog <code class=\"docutils literal notranslate\"><span class=\"pre\">polls</span></code> poza projekt, nie działa. Naprawimy to teraz instalując nasz nowy pakiet <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code>.</p>\n<aside class=\"admonition-installing-as-a-user-library admonition\">\n<p class=\"admonition-title\">Instalowanie jako bibliotekę użytkownika</p>\n<p>Poniższe kroki zainstalują <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code> jako bibliotekę użytkownika. Instalacja bibliotek per użytkownik posiada sporo zalet w porównaniu do instalacji paczek per system jak np. możliwość instalacji bibliotek w systemie, w którym nie posiadasz uprawnień administracyjnych oraz zapobieganie wpływu biblioteki na system i innych jego użytkowników.</p>\n<p>Pamiętaj, że instalacja per użytkownik nadal może wpłynąć na narzędzia systemowe uruchamiane przez tego samego użytkownika, więc <code class=\"docutils literal notranslate\"><span class=\"pre\">virtualenv</span></code> jest bardziej niezawodnym rozwiązaniem (patrz niżej).</p>\n</aside>\n<ol class=\"arabic\">\n<li><p>Aby zainstalować pakiet, użyj pipa (już <a class=\"reference internal\" href=\"#installing-reusable-apps-prerequisites\"><span class=\"std std-ref\">go zainstalowałeś</span></a>, prawda?):</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">pip</span> <span class=\"n\">install</span> <span class=\"o\">--</span><span class=\"n\">user</span> <span class=\"n\">django</span><span class=\"o\">-</span><span class=\"n\">polls</span><span class=\"o\">/</span><span class=\"n\">dist</span><span class=\"o\">/</span><span class=\"n\">django</span><span class=\"o\">-</span><span class=\"n\">polls</span><span class=\"o\">-</span><span class=\"mf\">0.1</span><span class=\"o\">.</span><span class=\"n\">tar</span><span class=\"o\">.</span><span class=\"n\">gz</span>\n</code></pre></div>\n</li>\n<li><p>Z odrobiną szczęścia, twój projekt Django powinien teraz działać znów poprawnie. Uruchom serwer ponownie, aby to potwierdzić.</p></li>\n<li><p>Aby odinstalować pakiet, użyj pipa:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">pip</span> <span class=\"n\">uninstall</span> <span class=\"n\">django</span><span class=\"o\">-</span><span class=\"n\">polls</span>\n</code></pre></div>\n</li>\n</ol>\n</section>\n<section id=\"publishing-your-app\">\n<h2>Publikowanie twojej aplikacji<a class=\"heading-anchor\" href=\"#publishing-your-app\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Teraz, kiedy już spakowaliśmy i przetestowaliśmy <code class=\"docutils literal notranslate\"><span class=\"pre\">django-polls</span></code>, są gotowe do podzielenia się ze światem! Gdyby to nie był tylko przykład, mógłbyś teraz:</p>\n<ul class=\"simple\">\n<li><p>Wyślij e-mail z pakietem do znajomego.</p></li>\n<li><p>Załaduj pakiet na swoją stronę.</p></li>\n<li><p>Opublikuj pakiet w publicznym repozytorium, takim jak <a class=\"reference external\" href=\"https://pypi.org/\">Python Package Index (PyPI)</a>. <a class=\"reference external\" href=\"https://packaging.python.org\">packaging.python.org</a> ma <a class=\"reference external\" href=\"https://packaging.python.org/distributing/#uploading-your-project-to-pypi\">dobry tutorial</a> na ten temat.</p></li>\n</ul>\n</section>\n<section id=\"installing-python-packages-with-virtualenv\">\n<h2>Instalowanie pakietów Pythona z virtualenvem<a class=\"heading-anchor\" href=\"#installing-python-packages-with-virtualenv\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Wcześniej zainstalowaliśmy aplikację ankietową jako bibliotekę użytkownika. Ma to pewne wady:</p>\n<ul class=\"simple\">\n<li><p>Modyfikowanie bibliotek użytkownika może wpłynąć na inne oprogramowanie Python w twoim systemie.</p></li>\n<li><p>Nie będziesz w stanie uruchamiać wielu wersji tego pakietu (lub innych o takiej samej nazwie).</p></li>\n</ul>\n<p>Zazwyczaj takie sytuacje zdarzają się tylko kiedy utrzymujesz kilka projektów Django. W takiej sytuacji najlepszym rozwiązaniem jest <a class=\"reference external\" href=\"https://virtualenv.pypa.io/\">virtualenv</a>. To narzędzie pozwala utrzymywać wiele izolowanych środowisk Pythona, każdy ze swoimi własnymi kopiami bibliotek i przestrzeniami nazw dla pakietów.</p>\n</section>","rootId":"advanced-tutorial-how-to-write-reusable-apps","toc":[{"title":"Możliwość ponownego użycia ma znaczenie","anchor":"reusability-matters","children":[]},{"title":"Twój projekt i twoja aplikacja do ponownego wykorzystania","anchor":"your-project-and-your-reusable-app","children":[]},{"title":"Instalowanie narzędzi","anchor":"installing-some-prerequisites","children":[]},{"title":"Pakowanie twojej aplikacji","anchor":"packaging-your-app","children":[]},{"title":"Używanie twojego własnego pakietu","anchor":"using-your-own-package","children":[]},{"title":"Publikowanie twojej aplikacji","anchor":"publishing-your-app","children":[]},{"title":"Instalowanie pakietów Pythona z virtualenvem","anchor":"installing-python-packages-with-virtualenv","children":[]}],"breadcrumbs":[{"docname":"intro/index","title":"Pierwsze kroki","url":"/pl/2.0/intro/"}],"prev":{"docname":"intro/tutorial07","title":"Pisanie pierwszej aplikacji Django, część 7.","url":"/pl/2.0/intro/tutorial07/"},"next":{"docname":"intro/whatsnext","title":"Co czytać dalej","url":"/pl/2.0/intro/whatsnext/"},"formats":{"html":"/pl/2.0/intro/reusable-apps/","markdown":"/pl/2.0/intro/reusable-apps.md","json":"/pl/2.0/intro/reusable-apps.json"},"source":"https://github.com/django/django/blob/stable/2.0.x/docs/intro/reusable-apps.txt","official":"https://docs.djangoproject.com/pl/2.0/intro/reusable-apps/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}