{"title":"Tutorial avançado: Como escrever aplicações reutilizáveis","version":"2.2","locale":"pt-br","docname":"intro/reusable-apps","url":"/pt-br/2.2/intro/reusable-apps/","canonical":"https://djangodocs.dev/pt-br/2.2/intro/reusable-apps/","summary":"Este tutorial avançado começa onde o Tutorial 7 terminou. Nós transformaremos nossa aplicação web em um pacote Python autônomo que você pode reutilizar em…","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>Este tutorial avançado começa onde o <a class=\"reference internal\" href=\"/pt-br/2.2/intro/tutorial07/\"><span class=\"doc\">Tutorial 7</span></a> terminou. Nós transformaremos nossa aplicação web em um pacote Python autônomo que você pode reutilizar em novos projetos e compartilhar com outras pessoas.</p>\n<p>Caso não tenha completado recentemente os tutoriais 1-7, encorajamos revisá-los Dessa forma seu projeto de exemplo será compatível com o descrito abaixo.</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 é um modo de vida no Python. <a class=\"reference external\" href=\"https://pypi.org/\">The Python Package Index (PyPI)</a> tem uma vasta gama de pacotes que você pode usar no seus próprios programas Python. Dê uma olhada em  <a class=\"reference external\" href=\"https://djangopackages.org\">Django Packages</a> para aplicações reutilizáveis existentes que você pode incorporrar no seu projeto. O próprio Django é ele um pacote Python. Isso significa que você pode pegar pacotes Python e aplicações Django e compor com seu projeto Web. Você só precisa escrever as partes que tornam seu projeto único.</p>\n<p>Vamos dizer que você está iniciando um projeto que precisa de uma aplicação de enquetes como a que estivemos trabalhando. Como fazer essa aplicação reutilizável? Sua sorte é que é que você já está no caminho. Em <a class=\"reference internal\" href=\"/pt-br/2.2/intro/tutorial01/\"><span class=\"doc\">Tutorial</span></a>, vimos como podemos desacoplar a enquete do URLconf do projeto usando um <code class=\"docutils literal notranslate\">include</code>. Neste tutorial, iremos adiante para tornar a aplicação fácil de usar em novos projetos e pronta para publicar para outros instalarem e usarem.</p>\n<aside class=\"admonition-package-app admonition\" role=\"note\">\n<p class=\"admonition-title\">Pacote? Aplicação?</p>\n<p>Um <span class=\"xref std std-term\">pacote</span> Python fornece uma maneira de agrupar códigos Python relacionados para fácil reutilização. Um pacote contém um ou mais arquivos de códigos Python (também conhecidos como “módulos”).</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/2.2/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/2.2/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.org/project/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.org/project/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/2.2/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 django-polls`.</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/2.2/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/2.2/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=\"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>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 <code class=\"docutils literal notranslate\">setup.cfg</code> and <code class=\"docutils literal notranslate\">setup.py</code> files which detail how to\nbuild and install the app. A full explanation of these files is beyond the\nscope of this tutorial, but the <a class=\"reference external\" href=\"https://setuptools.readthedocs.io/en/latest/\">setuptools documentation</a> has a good explanation.\nCreate the files <code class=\"docutils literal notranslate\">django-polls/setup.cfg</code> and <code class=\"docutils literal notranslate\">django-polls/setup.py</code>\nwith the following contents:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"ini\"><figcaption class=\"code-block-caption\">django-polls/setup.cfg</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Ini</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=\"Ini code\"><code><span class=\"k\">[metadata]</span>\n<span class=\"na\">name</span> <span class=\"o\">=</span> <span class=\"s\">django-polls</span>\n<span class=\"na\">version</span> <span class=\"o\">=</span> <span class=\"s\">0.1</span>\n<span class=\"na\">description</span> <span class=\"o\">=</span> <span class=\"s\">A Django app to conduct Web-based polls.</span>\n<span class=\"na\">long_description</span> <span class=\"o\">=</span> <span class=\"s\">file: README.rst</span>\n<span class=\"na\">url</span> <span class=\"o\">=</span> <span class=\"s\">https://www.example.com/</span>\n<span class=\"na\">author</span> <span class=\"o\">=</span> <span class=\"s\">Your Name</span>\n<span class=\"na\">author_email</span> <span class=\"o\">=</span> <span class=\"s\">yourname@example.com</span>\n<span class=\"na\">license</span> <span class=\"o\">=</span> <span class=\"s\">BSD-3-Clause</span>  <span class=\"c1\"># Example license</span>\n<span class=\"na\">classifiers</span> <span class=\"o\">=</span>\n    <span class=\"na\">Environment</span> <span class=\"o\">:</span><span class=\"s\">: Web Environment</span>\n    <span class=\"na\">Framework</span> <span class=\"o\">:</span><span class=\"s\">: Django</span>\n    <span class=\"na\">Framework</span> <span class=\"o\">:</span><span class=\"s\">: Django :: X.Y</span>  <span class=\"c1\"># Replace &quot;X.Y&quot; as appropriate</span>\n    <span class=\"na\">Intended Audience</span> <span class=\"o\">:</span><span class=\"s\">: Developers</span>\n    <span class=\"na\">License</span> <span class=\"o\">:</span><span class=\"s\">: OSI Approved :: BSD License</span>\n    <span class=\"na\">Operating System</span> <span class=\"o\">:</span><span class=\"s\">: OS Independent</span>\n    <span class=\"na\">Programming Language</span> <span class=\"o\">:</span><span class=\"s\">: Python</span>\n    <span class=\"na\">Programming Language</span> <span class=\"o\">:</span><span class=\"s\">: Python :: 3</span>\n    <span class=\"na\">Programming Language</span> <span class=\"o\">:</span><span class=\"s\">: Python :: 3 :: Only</span>\n    <span class=\"na\">Programming Language</span> <span class=\"o\">:</span><span class=\"s\">: Python :: 3.6</span>\n    <span class=\"na\">Programming Language</span> <span class=\"o\">:</span><span class=\"s\">: Python :: 3.7</span>\n    <span class=\"na\">Programming Language</span> <span class=\"o\">:</span><span class=\"s\">: Python :: 3.8</span>\n    <span class=\"na\">Topic</span> <span class=\"o\">:</span><span class=\"s\">: Internet :: WWW/HTTP</span>\n    <span class=\"na\">Topic</span> <span class=\"o\">:</span><span class=\"s\">: Internet :: WWW/HTTP :: Dynamic Content</span>\n\n<span class=\"k\">[options]</span>\n<span class=\"na\">include_package_data</span> <span class=\"o\">=</span> <span class=\"s\">true</span>\n<span class=\"na\">packages</span> <span class=\"o\">=</span> <span class=\"s\">find:</span>\n</code></pre></figure>\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\">from</span> <span class=\"nn\">setuptools</span> <span class=\"kn\">import</span> setup\n\n setup<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=\"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>É 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 empacotamente, veja o <a class=\"reference external\" href=\"https://packaging.python.org/tutorials/packaging-projects/\">Tutorial 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>Colocar o pacote em um repositório público, tal como <a class=\"reference external\" href=\"https://pypi.org/\">the Python Package Index (PyPI)</a>. <a class=\"reference external\" href=\"https://packaging.python.org\">packaging.python.org</a> tem <a class=\"reference external\" href=\"https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives\">um bom tutorial</a> para 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>Em geral, essas situações somente vêm a tona quando se mantém vários projetos Django. Neste caso, a melhor solução é usar o <a class=\"reference external\" href=\"https://virtualenv.pypa.io/\">virtualenv</a>. Esta ferramenta permite que você mantenha múltiplos ambientes Python isolados, cada um com sua própria cópia de bibliotecas e “namespaces” 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/2.2/intro/"}],"prev":{"docname":"intro/tutorial07","title":"Escrevendo seu primeiro app Django, parte 7","url":"/pt-br/2.2/intro/tutorial07/"},"next":{"docname":"intro/whatsnext","title":"O que ler a seguir","url":"/pt-br/2.2/intro/whatsnext/"},"formats":{"html":"/pt-br/2.2/intro/reusable-apps/","markdown":"/pt-br/2.2/intro/reusable-apps.md","json":"/pt-br/2.2/intro/reusable-apps.json"},"source":"https://github.com/django/django/blob/stable/2.2.x/docs/intro/reusable-apps.txt","official":"https://docs.djangoproject.com/pt-br/2.2/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","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}