committed by
GitHub
1 changed files with 169 additions and 0 deletions
@ -0,0 +1,169 @@ |
|||
# Execute um Servidor Manualmente |
|||
|
|||
## Utilize o comando `fastapi run` |
|||
|
|||
Em resumo, utilize o comando `fastapi run` para inicializar sua aplicação FastAPI: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ <font color="#4E9A06">fastapi</font> run <u style="text-decoration-style:single">main.py</u> |
|||
<font color="#3465A4">INFO </font> Using path <font color="#3465A4">main.py</font> |
|||
<font color="#3465A4">INFO </font> Resolved absolute path <font color="#75507B">/home/user/code/awesomeapp/</font><font color="#AD7FA8">main.py</font> |
|||
<font color="#3465A4">INFO </font> Searching for package file structure from directories with <font color="#3465A4">__init__.py</font> files |
|||
<font color="#3465A4">INFO </font> Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font> |
|||
|
|||
╭─ <font color="#8AE234"><b>Python module file</b></font> ─╮ |
|||
│ │ |
|||
│ 🐍 main.py │ |
|||
│ │ |
|||
╰──────────────────────╯ |
|||
|
|||
<font color="#3465A4">INFO </font> Importing module <font color="#4E9A06">main</font> |
|||
<font color="#3465A4">INFO </font> Found importable FastAPI app |
|||
|
|||
╭─ <font color="#8AE234"><b>Importable FastAPI app</b></font> ─╮ |
|||
│ │ |
|||
│ <span style="background-color:#272822"><font color="#FF4689">from</font></span><span style="background-color:#272822"><font color="#F8F8F2"> main </font></span><span style="background-color:#272822"><font color="#FF4689">import</font></span><span style="background-color:#272822"><font color="#F8F8F2"> app</font></span><span style="background-color:#272822"> </span> │ |
|||
│ │ |
|||
╰──────────────────────────╯ |
|||
|
|||
<font color="#3465A4">INFO </font> Using import string <font color="#8AE234"><b>main:app</b></font> |
|||
|
|||
<font color="#4E9A06">╭─────────── FastAPI CLI - Production mode ───────────╮</font> |
|||
<font color="#4E9A06">│ │</font> |
|||
<font color="#4E9A06">│ Serving at: http://0.0.0.0:8000 │</font> |
|||
<font color="#4E9A06">│ │</font> |
|||
<font color="#4E9A06">│ API docs: http://0.0.0.0:8000/docs │</font> |
|||
<font color="#4E9A06">│ │</font> |
|||
<font color="#4E9A06">│ Running in production mode, for development use: │</font> |
|||
<font color="#4E9A06">│ │</font> |
|||
<font color="#4E9A06">│ </font><font color="#8AE234"><b>fastapi dev</b></font><font color="#4E9A06"> │</font> |
|||
<font color="#4E9A06">│ │</font> |
|||
<font color="#4E9A06">╰─────────────────────────────────────────────────────╯</font> |
|||
|
|||
<font color="#4E9A06">INFO</font>: Started server process [<font color="#06989A">2306215</font>] |
|||
<font color="#4E9A06">INFO</font>: Waiting for application startup. |
|||
<font color="#4E9A06">INFO</font>: Application startup complete. |
|||
<font color="#4E9A06">INFO</font>: Uvicorn running on <b>http://0.0.0.0:8000</b> (Press CTRL+C to quit) |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
Isto deve funcionar para a maioria dos casos. 😎 |
|||
|
|||
Você pode utilizar esse comando, por exemplo, para iniciar sua aplicação **FastAPI** em um contêiner, em um servidor, etc. |
|||
|
|||
## Servidores ASGI |
|||
|
|||
Vamos nos aprofundar um pouco mais em detalhes. |
|||
|
|||
FastAPI utiliza um padrão para construir frameworks e servidores web em Python chamado <abbr title="Asynchronous Server Gateway Interface">ASGI</abbr>. FastAPI é um framework web ASGI. |
|||
|
|||
A principal coisa que você precisa para executar uma aplicação **FastAPI** (ou qualquer outra aplicação ASGI) em uma máquina de servidor remoto é um programa de servidor ASGI como o **Uvicorn**, que é o que vem por padrão no comando `fastapi`. |
|||
|
|||
Existem diversas alternativas, incluindo: |
|||
|
|||
* <a href="https://www.uvicorn.org/" class="external-link" target="_blank">Uvicorn</a>: um servidor ASGI de alta performance. |
|||
* <a href="https://hypercorn.readthedocs.io/" class="external-link" target="_blank">Hypercorn</a>: um servidor ASGI compátivel com HTTP/2, Trio e outros recursos. |
|||
* <a href="https://github.com/django/daphne" class="external-link" target="_blank">Daphne</a>: servidor ASGI construído para Django Channels. |
|||
* <a href="https://github.com/emmett-framework/granian" class="external-link" target="_blank">Granian</a>: um servidor HTTP Rust para aplicações Python. |
|||
* <a href="https://unit.nginx.org/howto/fastapi/" class="external-link" target="_blank">NGINX Unit</a>: NGINX Unit é um runtime de aplicação web leve e versátil. |
|||
|
|||
## Máquina Servidora e Programa Servidor |
|||
|
|||
Existe um pequeno detalhe sobre estes nomes para se manter em mente. 💡 |
|||
|
|||
A palavra "**servidor**" é comumente usada para se referir tanto ao computador remoto/nuvem (a máquina física ou virtual) quanto ao programa que está sendo executado nessa máquina (por exemplo, Uvicorn). |
|||
|
|||
Apenas tenha em mente que quando você ler "servidor" em geral, isso pode se referir a uma dessas duas coisas. |
|||
|
|||
Quando se refere à máquina remota, é comum chamá-la de **servidor**, mas também de **máquina**, **VM** (máquina virtual), **nó**. Todos esses termos se referem a algum tipo de máquina remota, normalmente executando Linux, onde você executa programas. |
|||
|
|||
## Instale o Programa Servidor |
|||
|
|||
Quando você instala o FastAPI, ele vem com um servidor de produção, o Uvicorn, e você pode iniciá-lo com o comando `fastapi run`. |
|||
|
|||
Mas você também pode instalar um servidor ASGI manualmente. |
|||
|
|||
Certifique-se de criar um [ambiente virtual](../virtual-environments.md){.internal-link target=_blank}, ativá-lo e, em seguida, você pode instalar a aplicação do servidor. |
|||
|
|||
Por exemplo, para instalar o Uvicorn: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ pip install "uvicorn[standard]" |
|||
|
|||
---> 100% |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
Um processo semelhante se aplicaria a qualquer outro programa de servidor ASGI. |
|||
|
|||
/// tip | "Dica" |
|||
|
|||
Adicionando o `standard`, o Uvicorn instalará e usará algumas dependências extras recomendadas. |
|||
|
|||
Isso inclui o `uvloop`, a substituição de alto desempenho para `asyncio`, que fornece um grande aumento de desempenho de concorrência. |
|||
|
|||
Quando você instala o FastAPI com algo como `pip install "fastapi[standard]"`, você já obtém `uvicorn[standard]` também. |
|||
|
|||
/// |
|||
|
|||
## Execute o Programa Servidor |
|||
|
|||
Se você instalou um servidor ASGI manualmente, normalmente precisará passar uma string de importação em um formato especial para que ele importe sua aplicação FastAPI: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ uvicorn main:app --host 0.0.0.0 --port 80 |
|||
|
|||
<span style="color: green;">INFO</span>: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit) |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
/// note | "Nota" |
|||
|
|||
O comando `uvicorn main:app` refere-se a: |
|||
|
|||
* `main`: o arquivo `main.py` (o "módulo" Python). |
|||
* `app`: o objeto criado dentro de `main.py` com a linha `app = FastAPI()`. |
|||
|
|||
É equivalente a: |
|||
|
|||
```Python |
|||
from main import app |
|||
``` |
|||
|
|||
/// |
|||
|
|||
Cada programa de servidor ASGI alternativo teria um comando semelhante, você pode ler mais na documentação respectiva. |
|||
|
|||
/// warning | "Aviso" |
|||
|
|||
Uvicorn e outros servidores suportam a opção `--reload` que é útil durante o desenvolvimento. |
|||
|
|||
A opção `--reload` consome muito mais recursos, é mais instável, etc. |
|||
|
|||
Ela ajuda muito durante o **desenvolvimento**, mas você **não deve** usá-la em **produção**. |
|||
|
|||
/// |
|||
|
|||
## Conceitos de Implantação |
|||
|
|||
Esses exemplos executam o programa do servidor (por exemplo, Uvicorn), iniciando **um único processo**, ouvindo em todos os IPs (`0.0.0.0`) em uma porta predefinida (por exemplo, `80`). |
|||
|
|||
Esta é a ideia básica. Mas você provavelmente vai querer cuidar de algumas coisas adicionais, como: |
|||
|
|||
* Segurança - HTTPS |
|||
* Executando na inicialização |
|||
* Reinicializações |
|||
* Replicação (o número de processos em execução) |
|||
* Memória |
|||
* Passos anteriores antes de começar |
|||
|
|||
Vou te contar mais sobre cada um desses conceitos, como pensar sobre eles e alguns exemplos concretos com estratégias para lidar com eles nos próximos capítulos. 🚀 |
Loading…
Reference in new issue