{"title":"Tutorial avançado: Como escrever aplicações reutilizáveis","version":"1.9","locale":"pt-br","docname":"intro/reusable-apps","url":"/pt-br/1.9/intro/reusable-apps/","canonical":"https://djangodocs.dev/pt-br/1.9/intro/reusable-apps/","summary":"This advanced tutorial begins where Tutorial 7 left off. We’ll be turning our Web-poll into a standalone Python package you can reuse in new projects and…","html":"<h1>Tutorial avançado: Como escrever aplicações reutilizáveis<a class=\"heading-anchor\" href=\"#advanced-tutorial-how-to-write-reusable-apps\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>This advanced tutorial begins where <a class=\"reference internal\" href=\"/pt-br/1.9/intro/tutorial07/\"><span class=\"doc\">Tutorial 7</span></a>\nleft off. We’ll be turning our Web-poll into a standalone Python package\nyou can reuse in new projects and share with other people.</p>\n<p>If you haven’t recently completed Tutorials 1–7, we encourage you to review\nthese so that your example project matches the one described below.</p>\n<section id=\"reusability-matters\">\n<h2>Reutilização importa<a class=\"heading-anchor\" href=\"#reusability-matters\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>É um grande trabalho projetar, contruir, testar e manter uma aplicação web. Muitos projetos Python e Django compartilham problemas em comum. Não seria ótimo se nós pudessemos economizar um pouco desse trabalho repetido?</p>\n<p>Reusabilidade é o modo de vida em Python. O <a class=\"reference external\" href=\"https://pypi.python.org/pypi\">Python Package Index (PyPI)</a> tem uma grande variedade de pacotes que você pode usar nos seus programas Python. Confira o <a class=\"reference external\" href=\"https://www.djangopackages.com\">Django Packages</a> para aplicações reusáveis existentes que você poderia incorporar no seu projeto. Django em si também é um pacote Python. Isso significa que você pode ter pacotes Python existentes ou aplicações Django e compô-los em seu próprio projeto web. Você então só precisa escrever as partes que tornam seu projeto único.</p>\n<p>Digamos que você estava iniciando um novo projeto que precisava de uma aplicação de enquetes, como a que estávamos trabalhando. Como você torna essa aplicação reusável? Felizmente, você já está no caminho certo. No <a class=\"reference internal\" href=\"/pt-br/1.9/intro/tutorial03/\"><span class=\"doc\">Tutorial 3</span></a>, nós vimos como poderíamos desacoplar a aplicação de enquete no URLconf do projeto usando um <code class=\"docutils literal notranslate\">include</code>. Neste tutorial, vamos tomar novas medidas para tornar a aplicação fácil de usar em novos projetos, e pronta para publicar para outros instalarem e usar.</p>\n<aside class=\"admonition-package-app admonition\" role=\"note\">\n<p class=\"admonition-title\">Pacote? Aplicação?</p>\n<p>A Python <a class=\"reference external\" href=\"https://docs.python.org/3/glossary.html#term-package\" title=\"(em Python v3.14)\"><span class=\"xref std std-term\">package</span></a> provides a way of grouping related Python code for\neasy reuse. A package contains one or more files of Python code (also known\nas “modules”).</p>\n<p>Um pacote pode ser importado com <code class=\"docutils literal notranslate\">import foo.bar</code> ou <code class=\"docutils literal notranslate\">from foo import bar</code>. Para um diretório (como <code class=\"docutils literal notranslate\">polls</code>) formar um pacote, ele deve conter um arquivo especial <code class=\"docutils literal notranslate\">__init__.py</code>, mesmo se este arquivo estiver vazio.</p>\n<p>Uma <em>aplicação</em> Django é apenas um pacote Python que é especificamente destinado para usar em um projeto Django. Uma aplicação pode usar convenções comuns do Django, tais como ter submódulos <code class=\"docutils literal notranslate\">models</code>, <code class=\"docutils literal notranslate\">tests</code>, <code class=\"docutils literal notranslate\">urls</code>, e <code class=\"docutils literal notranslate\">views</code>.</p>\n<p>Posteriormente usamos o termo <em>empacotamento</em> para descrever o processo de tornar um pacote Python fácil para outros instalarem. Pode ser um pouco confuso, nós sabemos.</p>\n</aside>\n</section>\n<section id=\"your-project-and-your-reusable-app\">\n<h2>Seu projeto e sua aplicação reutilizável<a class=\"heading-anchor\" href=\"#your-project-and-your-reusable-app\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Depois dos tutoriais anteriores, nosso projeto deve ficar assim:</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>mysite<span class=\"o\">/</span>\n    manage<span class=\"o\">.</span>py\n    mysite<span class=\"o\">/</span>\n        <span class=\"fm\">__init__</span><span class=\"o\">.</span>py\n        settings<span class=\"o\">.</span>py\n        urls<span class=\"o\">.</span>py\n        wsgi<span class=\"o\">.</span>py\n    polls<span class=\"o\">/</span>\n        <span class=\"fm\">__init__</span><span class=\"o\">.</span>py\n        admin<span class=\"o\">.</span>py\n        migrations<span class=\"o\">/</span>\n            <span class=\"fm\">__init__</span><span class=\"o\">.</span>py\n            <span class=\"mi\">0001</span>_initial<span class=\"o\">.</span>py\n        models<span class=\"o\">.</span>py\n        static<span class=\"o\">/</span>\n            polls<span class=\"o\">/</span>\n                images<span class=\"o\">/</span>\n                    background<span class=\"o\">.</span>gif\n                style<span class=\"o\">.</span>css\n        templates<span class=\"o\">/</span>\n            polls<span class=\"o\">/</span>\n                detail<span class=\"o\">.</span>html\n                index<span class=\"o\">.</span>html\n                results<span class=\"o\">.</span>html\n        tests<span class=\"o\">.</span>py\n        urls<span class=\"o\">.</span>py\n        views<span class=\"o\">.</span>py\n    templates<span class=\"o\">/</span>\n        admin<span class=\"o\">/</span>\n            base_site<span class=\"o\">.</span>html\n</code></pre></div>\n<p>Você criou <code class=\"docutils literal notranslate\">mysite/templates</code> em <a class=\"reference internal\" href=\"/pt-br/1.9/intro/tutorial07/\"><span class=\"doc\">Tutorial 7</span></a>, e <code class=\"docutils literal notranslate\">polls/templates</code> en <a class=\"reference internal\" href=\"/pt-br/1.9/intro/tutorial03/\"><span class=\"doc\">Tutorial 3</span></a>. Talvez agora fique caro porque escolhemos separar o diretório de templates do de projeto e aplicação: tudo que é parte da aplicação “polls” está em <code class=\"docutils literal notranslate\">polls</code>. Isso torna a aplicação auto-contida e facilita adicioná-la em um novo projeto.</p>\n<p>O diretório <code class=\"docutils literal notranslate\">polls</code> poderia agora ser copiado em um novo projeto Django, e imediatamente reusada. Embora não esteja já pronta para ser publicada. Para isso, nós precisamos empacotar a aplicação para tornar fácil para outros instalarem.</p>\n</section>\n<section id=\"installing-some-prerequisites\">\n<span id=\"installing-reusable-apps-prerequisites\"></span><h2>Instalando alguns pré-requisitos<a class=\"heading-anchor\" href=\"#installing-some-prerequisites\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>O estado atual do empacotamento Python é um pouco complicado com várias ferramentas. Para este tutorial, vamos estar usando <a class=\"reference external\" href=\"https://pypi.python.org/pypi/setuptools\">setuptools</a> para construir nosso pacote. É a ferramenta de empacotamento recomendada (mergeado com o fork do <code class=\"docutils literal notranslate\">distribute</code>). Estaremos usando também o <a class=\"reference external\" href=\"https://pypi.python.org/pypi/pip\">pip</a> para instalar e desinstalá-los. Você deve instalar esses dois pacotes agora. Se precisar de ajuda, você pode consultar o <a class=\"reference internal\" href=\"/pt-br/1.9/topics/install/#installing-official-release\"><span class=\"std std-ref\">como instalar Django com pip</span></a>. Você pode instalar o <code class=\"docutils literal notranslate\">setuptools</code> da mesma maneira.</p>\n</section>\n<section id=\"packaging-your-app\">\n<h2>Empacotando sua aplicação<a class=\"heading-anchor\" href=\"#packaging-your-app\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><em>Empacotamento</em> Python refere-se a preparar sua aplicação num formato específico que possa ser facilmente instalado e usado. O próprio Django é empacotado de uma maneira muito parecida. Para aplicações pequenas, como a de enquetes, esse processo não é tão difícil.</p>\n<ol class=\"arabic\">\n<li><p>Primeiro, crie um diretório pai para <code class=\"docutils literal notranslate\">polls</code>, fora do seu projeto Django. Nomeie esse diretório de</p>\n<aside class=\"admonition-choosing-a-name-for-your-app admonition\" role=\"note\">\n<p class=\"admonition-title\">Escolhendo um nome para a sua aplicação</p>\n<p>Quando for escolher um nome para o seu pacote, cheque fontes como PyPI para evitar conflitos de nomes com pacotes existentes. Ao criar um pacote para distribuir, geralmente é  útil prefixar <code class=\"docutils literal notranslate\">django-</code> ao nome do seu módulo. Isso ajuda outros que estão procurando por aplicação Django identificarem sua aplicação como uma específica do Django.</p>\n<p>Rótulo da aplicação (isto é, a parte final do caminho pontilhado para os pacotes da aplicação) <em>deve</em> ser único no <a class=\"reference internal\" href=\"/pt-br/1.9/ref/settings/#std-setting-INSTALLED_APPS\"><code class=\"xref std std-setting docutils literal notranslate\">INSTALLED_APPS</code></a>. Evite usar o mesmo rótulo como os do pacote <a class=\"reference internal\" href=\"/pt-br/1.9/ref/contrib/\"><span class=\"doc\">contrib</span></a> do Django, por exemplo <code class=\"docutils literal notranslate\">auth</code>, <code class=\"docutils literal notranslate\">admin</code>, ou <code class=\"docutils literal notranslate\">messages</code>.</p>\n</aside>\n</li>\n<li><p>Mova o diretório <code class=\"docutils literal notranslate\">polls</code> para dentro do diretório <code class=\"docutils literal notranslate\">django-polls</code>.</p></li>\n<li><p>Crie um arquivo <code class=\"docutils literal notranslate\">django-polls/README.rst</code> com o seguinte conteúdo:</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    url(r&#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>Crie um arquivo <code class=\"docutils literal notranslate\">django-polls/LICENSE</code>. Escolher uma licença está fora do escopo deste tutorial, mas é suficiente dizer que código distribuído publicamente sem uma licença é <em>inútil</em>. Djando e muitas aplicações compatíveis com o Django são distribuídas sob a licença BSD; no entanto, você é livre para escolher sua própria licença. Apenas esteja ciente que a escolha da sua licença afetará quem pode usar seu código.</p></li>\n<li><p>Next we’ll create a <code class=\"docutils literal notranslate\">setup.py</code> file which provides details about how to\nbuild and install the app.  A full explanation of this file is beyond the\nscope of this tutorial, but the <a class=\"reference external\" href=\"https://setuptools.readthedocs.io/en/latest/\">setuptools docs</a> have a good\nexplanation. Create a file <code class=\"docutils literal notranslate\">django-polls/setup.py</code> with the following\ncontents:</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=\"nn\">os</span>\n<span class=\"kn\">from</span> <span class=\"nn\">setuptools</span> <span class=\"kn\">import</span> find_packages<span class=\"p\">,</span> setup\n\n<span class=\"k\">with</span> <span class=\"nb\">open</span><span class=\"p\">(</span>os<span class=\"o\">.</span>path<span class=\"o\">.</span>join<span class=\"p\">(</span>os<span class=\"o\">.</span>path<span class=\"o\">.</span>dirname<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> readme<span class=\"p\">:</span>\n    README <span class=\"o\">=</span> readme<span class=\"o\">.</span>read<span class=\"p\">()</span>\n\n<span class=\"c1\"># allow setup.py to be run from any path</span>\nos<span class=\"o\">.</span>chdir<span class=\"p\">(</span>os<span class=\"o\">.</span>path<span class=\"o\">.</span>normpath<span class=\"p\">(</span>os<span class=\"o\">.</span>path<span class=\"o\">.</span>join<span class=\"p\">(</span>os<span class=\"o\">.</span>path<span class=\"o\">.</span>abspath<span class=\"p\">(</span><span class=\"vm\">__file__</span><span class=\"p\">),</span> os<span class=\"o\">.</span>pardir<span class=\"p\">)))</span>\n\nsetup<span class=\"p\">(</span>\n    name<span class=\"o\">=</span><span class=\"s1\">&#39;django-polls&#39;</span><span class=\"p\">,</span>\n    version<span class=\"o\">=</span><span class=\"s1\">&#39;0.1&#39;</span><span class=\"p\">,</span>\n    packages<span class=\"o\">=</span>find_packages<span class=\"p\">(),</span>\n    include_package_data<span class=\"o\">=</span><span class=\"kc\">True</span><span class=\"p\">,</span>\n    license<span class=\"o\">=</span><span class=\"s1\">&#39;BSD License&#39;</span><span class=\"p\">,</span>  <span class=\"c1\"># example license</span>\n    description<span class=\"o\">=</span><span class=\"s1\">&#39;A simple Django app to conduct Web-based polls.&#39;</span><span class=\"p\">,</span>\n    long_description<span class=\"o\">=</span>README<span class=\"p\">,</span>\n    url<span class=\"o\">=</span><span class=\"s1\">&#39;https://www.example.com/&#39;</span><span class=\"p\">,</span>\n    author<span class=\"o\">=</span><span class=\"s1\">&#39;Your Name&#39;</span><span class=\"p\">,</span>\n    author_email<span class=\"o\">=</span><span class=\"s1\">&#39;yourname@example.com&#39;</span><span class=\"p\">,</span>\n    classifiers<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=\"c1\"># Replace these appropriately if you are stuck on Python 2.</span>\n        <span class=\"s1\">&#39;Programming Language :: Python :: 3&#39;</span><span class=\"p\">,</span>\n        <span class=\"s1\">&#39;Programming Language :: Python :: 3.4&#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;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>Por padrão, apenas módulos e pacotes Python são incluídos no pacote. Para incluir arquivos adicionais, precisaremos criar um arquivo <code class=\"docutils literal notranslate\">MANIFEST.in</code>. A documentação do setuptools citada no passo anterior, fala deste arquivo em mais detalhes. Para incluir o templates, o <code class=\"docutils literal notranslate\">README.rst</code> e nosso arquivo <code class=\"docutils literal notranslate\">LICENSE</code>, crie um arquivo <code class=\"docutils literal notranslate\">django-polls/MANIFEST.in</code> com o seguinte conteúdo:</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>include LICENSE\ninclude README<span class=\"o\">.</span>rst\nrecursive<span class=\"o\">-</span>include polls<span class=\"o\">/</span>static <span class=\"o\">*</span>\nrecursive<span class=\"o\">-</span>include polls<span class=\"o\">/</span>templates <span class=\"o\">*</span>\n</code></pre></figure>\n</li>\n<li><p>É opcional, mas recomendado, incluir uma documentação detalhada com sua aplicação. Crie um diretório <code class=\"docutils literal notranslate\">django-polls/docs</code> vazio, para futura documentação. Adicione uma linha a mais ao</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>recursive<span class=\"o\">-</span>include docs <span class=\"o\">*</span>\n</code></pre></div>\n<p>Note que o diretório <code class=\"docutils literal notranslate\">docs</code> não será incluido no seu pacote a menos que você adicione alguns arquivos para ele. Muitas aplicações Django fornecem sua documentação online através de sites como</p>\n</li>\n<li><p>Tente criar seu pacote com <code class=\"docutils literal notranslate\">python setup.py sdist</code> (execute dentro do diretório <code class=\"docutils literal notranslate\">django-polls</code>). Esse comando cria um diretório chamado <code class=\"docutils literal notranslate\">dist</code> e cria seu novo pacote,</p></li>\n</ol>\n<p>Para mais informações sobre empacotamento, veja <a class=\"reference external\" href=\"https://packaging.python.org/en/latest/distributing.html\">Tutorial Python sobre Empacotamento e Distribuição de Projetos</a>.</p>\n</section>\n<section id=\"using-your-own-package\">\n<h2>Utilizando o seu próprio pacote<a class=\"heading-anchor\" href=\"#using-your-own-package\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Uma vez que movemos o diretório <code class=\"docutils literal notranslate\">polls</code> para fora do projeto, ele não funciona mais. Vamos consertar isso agora ao instalar nosso novo pacote <code class=\"docutils literal notranslate\">django-polls</code>.</p>\n<aside class=\"admonition-installing-as-a-user-library admonition\" role=\"note\">\n<p class=\"admonition-title\">Instalando uma biblioteca de usuário</p>\n<p>Os passos a seguir instalam <code class=\"docutils literal notranslate\">django-polls</code> como uma biblioteca do usuário. Instalação por usuário tem uma série de vantagens sobre a instalação do pacote em todo o sistema, tais como ser utilizável em sistemas onde você não tem acesso de administrador, bem como prevenir o pacote de afetar serviços do sistema e outros usuários da máquina.</p>\n<p>Note que instalações por usuário pode ainda afetar o comportamento de ferramentas do sistema que são executados com esse usuário, então <code class=\"docutils literal notranslate\">virtualenv</code> é uma solução mais robusta (veja abaixo):</p>\n</aside>\n<ol class=\"arabic\">\n<li><p>Para instalar o pacote, use o pip (você já <a class=\"reference internal\" href=\"#installing-reusable-apps-prerequisites\"><span class=\"std std-ref\">instalou isso</span></a>, certo?):</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>pip install <span class=\"o\">--</span>user django<span class=\"o\">-</span>polls<span class=\"o\">/</span>dist<span class=\"o\">/</span>django<span class=\"o\">-</span>polls<span class=\"o\">-</span><span class=\"mf\">0.1</span><span class=\"o\">.</span>tar<span class=\"o\">.</span>gz\n</code></pre></div>\n</li>\n<li><p>Com sorte, seu projeto Django deverá agora funcionar corretamente de novo. Inicie o servidor novamente para confirmar.</p></li>\n<li><p>Para desinstalar o pacote, use o pip:</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>pip uninstall django<span class=\"o\">-</span>polls\n</code></pre></div>\n</li>\n</ol>\n</section>\n<section id=\"publishing-your-app\">\n<h2>Publicando sua aplicação<a class=\"heading-anchor\" href=\"#publishing-your-app\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Agora que nós empacotamos e testamos <code class=\"docutils literal notranslate\">django-polls</code>, ele está pronto para ser compartilhado com o mundo! Se isso não foi apenas um exemplo, você pode agora:</p>\n<ul class=\"simple\">\n<li><p>Enviar o pacote por email para um amigo.</p></li>\n<li><p>Enviar o pacote para seu site.</p></li>\n<li><p>Postar o pacote em um repositório público, por exemplo,  o <a class=\"reference internal\" href=\"#the-python-package-index-pypi\">Python Package Index (PyPI)</a>. No <a class=\"reference external\" href=\"https://packaging.python.org\">packaging.python.org</a> há <a href=\"#id2\"><span class=\"problematic\" id=\"id3\">`um bom tutorial&lt;https://packaging.python.org/en/latest/distributing.html#uploading-your-project-to-pypi&gt;`_</span></a> para você fazer isso.</p></li>\n</ul>\n</section>\n<section id=\"installing-python-packages-with-virtualenv\">\n<h2>Instalando pacotes Python com virtualenv<a class=\"heading-anchor\" href=\"#installing-python-packages-with-virtualenv\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Anteriormente, nós instalamos nosso app de votação como uma biblioteca de usuário. Isso tem algumas desvantagens:</p>\n<ul class=\"simple\">\n<li><p>Modificar as bibliotecas de usuário pode afetar outros softwares em Python do seu sistema.</p></li>\n<li><p>Você não poderá rodar versões diferentes do seu pacote (ou outros pacotes com o mesmo nome).</p></li>\n</ul>\n<p>Tipicamente, essas situações apenas aparecem quando você está mantendo muitos projetos em Django. Quando isso acontece, a melhor solução é utilizar <a class=\"reference external\" href=\"http://www.virtualenv.org/\">virtualenv</a>. Essa ferramenta permite que você mantenha vários ambientes de Python isolados, cada um com sua própria cópia de bibliotecas e namespace de pacotes.</p>\n</section>","rootId":"advanced-tutorial-how-to-write-reusable-apps","toc":[{"title":"Reutilização importa","anchor":"reusability-matters","children":[]},{"title":"Seu projeto e sua aplicação reutilizável","anchor":"your-project-and-your-reusable-app","children":[]},{"title":"Instalando alguns pré-requisitos","anchor":"installing-some-prerequisites","children":[]},{"title":"Empacotando sua aplicação","anchor":"packaging-your-app","children":[]},{"title":"Utilizando o seu próprio pacote","anchor":"using-your-own-package","children":[]},{"title":"Publicando sua aplicação","anchor":"publishing-your-app","children":[]},{"title":"Instalando pacotes Python com virtualenv","anchor":"installing-python-packages-with-virtualenv","children":[]}],"breadcrumbs":[{"docname":"intro/index","title":"Introdução","url":"/pt-br/1.9/intro/"}],"prev":{"docname":"intro/tutorial07","title":"Escrevendo seu primeiro app Django, parte 7","url":"/pt-br/1.9/intro/tutorial07/"},"next":{"docname":"intro/whatsnext","title":"O que ler a seguir","url":"/pt-br/1.9/intro/whatsnext/"},"formats":{"html":"/pt-br/1.9/intro/reusable-apps/","markdown":"/pt-br/1.9/intro/reusable-apps.md","json":"/pt-br/1.9/intro/reusable-apps.json"},"source":"https://github.com/django/django/blob/stable/1.9.x/docs/intro/reusable-apps.txt","official":"https://docs.djangoproject.com/pt-br/1.9/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","1.9"],"inLocales":["en","fr","ja","id","pt-br","es"]}