{"title":"Zaawansowany tutorial: Jak pisać aplikacje wielokrotnego użytku","version":"2.1","locale":"pl","docname":"intro/reusable-apps","url":"/pl/2.1/intro/reusable-apps/","canonical":"https://djangodocs.dev/pl/2.1/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.1/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>Ponowne wykorzystanie to sposób na życie w Pythonie. <a class=\"reference external\" href=\"https://pypi.org/\">Python Package Index (PyPI)</a> zawiera obszerny zakres pakietów, które możesz wykorzystać w swoich własnych pythonowych programach. Sprawdź w <a class=\"reference external\" href=\"https://djangopackages.org\">Django Packages</a> istniejące aplikacje gotowe do wykorzystania, które mógłbyś wcielić w swój projekt. Samo Django także jest tylko pythonowym pakietem. To znaczy, że możesz wziąć istniejące pakiety Pythona lub aplikacje Django i złożyć z nich swój własny projekt webowy. Musisz jedynie napisać części, które uczynią twój projekt unikalnym.</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.1/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.1/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.1/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.1/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.1/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.1/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=\"rst\"><figcaption class=\"code-block-caption\">django-polls/README.rst</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Rst</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=\"Rst code\"><code><span class=\"gh\">=====</span>\n<span class=\"gh\">Polls</span>\n<span class=\"gh\">=====</span>\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\n<span class=\"gh\">Quick start</span>\n<span class=\"gh\">-----------</span>\n\n<span class=\"m\">1.</span> Add &quot;polls&quot; to your INSTALLED_APPS setting like this::\n\n    INSTALLED_APPS = [\n<span class=\"c\">        ...</span>\n<span class=\"c\">        &#39;polls&#39;,</span>\n<span class=\"c\">    ]</span>\n\n<span class=\"m\">2.</span> Include the polls URLconf in your project urls.py like this::\n\n    path(&#39;polls/&#39;, include(&#39;polls.urls&#39;)),\n\n<span class=\"m\">3.</span> Run <span class=\"nv\">`python manage.py migrate`</span> to create the polls models.\n\n<span class=\"m\">4.</span> 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\n<span class=\"m\">5.</span> 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=\"python\"><figcaption class=\"code-block-caption\">django-polls/setup.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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=\"Python code\"><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=\"text\"><figcaption class=\"code-block-caption\">django-polls/MANIFEST.in</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Text</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=\"Text code\"><code>include LICENSE\ninclude README.rst\nrecursive-include polls/static *\nrecursive-include polls/templates *\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 tutorial <a class=\"reference external\" href=\"https://packaging.python.org/tutorials/packaging-projects/\">Packaging Python Projects</a>.</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 internal\" href=\"#the-python-package-index-pypi\">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/tutorials/packaging-projects/#uploading-the-distribution-archives\">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.1/intro/"}],"prev":{"docname":"intro/tutorial07","title":"Pisanie pierwszej aplikacji Django, część 7.","url":"/pl/2.1/intro/tutorial07/"},"next":{"docname":"intro/whatsnext","title":"Co czytać dalej","url":"/pl/2.1/intro/whatsnext/"},"formats":{"html":"/pl/2.1/intro/reusable-apps/","markdown":"/pl/2.1/intro/reusable-apps.md","json":"/pl/2.1/intro/reusable-apps.json"},"source":"https://github.com/django/django/blob/stable/2.1.x/docs/intro/reusable-apps.txt","official":"https://docs.djangoproject.com/pl/2.1/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"]}