我将 Flask 中由 waitress 提供的应用程序迁移到由 uvicorn 提供的 FastAPI,但我无法强制链接(由 index.html 模板内的 url_for 生成)使用 HTTPS 而不是 HTTP。
我和女服务员一起使用:
from waitress import serve
import flask_app
PORT=5000
HOST_IP_ADDRESS='0.0.0.0'
serve(flask_app.app, host=HOST_IP_ADDRESS, port=PORT, url_scheme="https")
Run Code Online (Sandbox Code Playgroud)
对于 uvicorn,我尝试使用 proxy_headers,但这不起作用。我在index.html中使用了解决方法
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
Run Code Online (Sandbox Code Playgroud)
它正确地从静态文件加载了 style.css,但到另一个端点的链接仍然使用 HTTP。
有没有一种简单的方法可以强制 url_for 创建的所有链接都使用 HTTPS?
我们有一个 python 3.9 fastapi 服务器,我们试图在 heroku 上的 uvicorn 上运行它。\n当我们在实例上启动它时,它运行良好,heroku run bash但当它在 dyno 流形上正常启动时,端口不会绑定。
heroku/web.1 Starting process with command `uvicorn app.main:app --workers 4 --port 42374`\napp/web.1 INFO: Uvicorn running on http://127.0.0.1:42374 (Press CTRL+C to quit)\napp/web.1 INFO: Started parent process [4]\napp/web.1 INFO: Started server process [13]\napp/web.1 INFO: Waiting for application startup.\napp/web.1 INFO: Started server process [10]\napp/web.1 INFO: Waiting for application startup.\napp/web.1 INFO: Started server process [12]\napp/web.1 INFO: Waiting for application startup.\napp/web.1 INFO: Started server process [11]\napp/web.1 INFO: Waiting for application …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 python Fast API 框架代理外部网站(在不同容器上运行的 Flower 监控 URL):
\nclient = AsyncClient(base_url=f'http://containername:7800/monitor')\n\n@app.get(\xe2\x80\x9c/monitor/{path:path}\xe2\x80\x9d)\nasync def tile_request(path: str):\n req = client.build_request("GET", path)\n r = await client.send(req, stream=True)\n return StreamingResponse(\n r.aiter_raw(),\n background=BackgroundTask(r.aclose),\n headers=r.headers\n )\nRun Code Online (Sandbox Code Playgroud)\n它能够代理每个路径的容器 URL。对于前。
\nhttp://python_server:8001/monitor/dashboard --> http://containername:7800/monitor/dashboard
\nhttp://python_server:8001/monitor/tasks --> http://containername:7800/monitor/tasks
\n效果很好。但是当 PATH 的 URL 中有一些查询参数时,它会失败。
\n对于前。
\nhttp://python_server:8001/monitor/dashboard?json=1&_=1641485992460 --> redirects to http://containername:7800/monitor/dashboard \nRun Code Online (Sandbox Code Playgroud)\n(请注意,URL 中不会附加任何查询参数)。
\n任何人都可以帮助我们如何使用任何查询参数代理此外部网站的任何路径。
\n我有一个配置了 Gunicorn 的 FastAPI 服务器,部署在 AWS App Runner 上。当我尝试访问端点时,它工作正常,但是,24 小时后,当我尝试访问同一端点时,我收到 502 bad gateway 错误,此后 cloudWatch 上没有记录任何内容,直到我重新部署应用程序,然后它再次开始正常工作。
我怀疑这与我的 Gunicorn 配置本身有关,它在一段时间后以某种方式关闭了我的 API,而不是 AWS App Runner,但我还没有找到任何解决方案。我还在下面展示了我的 Gunicorn 设置。任何帮助将不胜感激。
from fastapi import FastAPI
import uvicorn
from fastapi.middleware.cors import CORSMiddleware
from gunicorn.app.base import BaseApplication
import os
import multiprocessing
api = FastAPI()
def number_of_workers():
print((multiprocessing.cpu_count() * 2) + 1)
return (multiprocessing.cpu_count() * 2) + 1
class StandaloneApplication(BaseApplication):
def __init__(self, app, options=None):
self.options = options or {}
self.application = app
super().__init__()
def load_config(self):
config = {
key: …Run Code Online (Sandbox Code Playgroud) 我有一个 React 前端向运行 FastAPI 的 Discord.py 机器人发出请求。在我的测试环境中一切都很好,但是当我部署到远程主机时 uvicorn 抱怨
WARNING: Invalid HTTP request received.
Traceback (most recent call last):
File "/home/container/uvicorn/protocols/http/h11_impl.py", line 136, in handle_events
event = self.conn.next_event()
File "/home/container/h11/_connection.py", line 443, in next_event
exc._reraise_as_remote_protocol_error()
File "/home/container/h11/_util.py", line 76, in _reraise_as_remote_protocol_error
raise self
File "/home/container/h11/_connection.py", line 425, in next_event
event = self._extract_next_receive_event()
File "/home/container/h11/_connection.py", line 367, in _extract_next_receive_event
event = self._reader(self._receive_buffer)
File "/home/container/h11/_readers.py", line 68, in maybe_read_from_IDLE_client
raise LocalProtocolError("illegal request line")
h11._util.RemoteProtocolError: illegal request line
2022-01-15 22:59:11,310 - Invalid HTTP …Run Code Online (Sandbox Code Playgroud) 我在 python 3.8 中使用 SQLModel
当我添加日期时间字段时created_at: datetime = Field(default_factory=utcnow(), nullable=False)
我收到此 错误
File "./app/main.py", line 16, in <module>
class Post(SQLModel, table=True):
File "/Users/markwardell/PycharmProjects/pythonProject/venv/lib/python3.8/site-packages/sqlmodel/main.py", line 277, in __new__
new_cls = super().__new__(cls, name, bases, dict_used, **config_kwargs)
File "pydantic/main.py", line 204, in pydantic.main.ModelMetaclass.__new__
File "pydantic/fields.py", line 488, in pydantic.fields.ModelField.infer
File "pydantic/fields.py", line 419, in pydantic.fields.ModelField.__init__
File "pydantic/fields.py", line 539, in pydantic.fields.ModelField.prepare
File "pydantic/fields.py", line 801, in pydantic.fields.ModelField.populate_validators
File "pydantic/validators.py", line 718, in find_validators
RuntimeError: error checking inheritance of <module 'datetime' from '/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.8/lib/python3.8/datetime.py'> …Run Code Online (Sandbox Code Playgroud) 我能够在本地运行 python FastAPI(连接到本地主机http://127.0.0.1:8000/),但是当我尝试通过容器运行时,在浏览器上没有得到任何响应。也没有错误消息。
main.py 的内容
from typing import Optional
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
return {"item_id": item_id, "q": q}
Run Code Online (Sandbox Code Playgroud)
Dockerfile 的内容
FROM python:3.9.5
WORKDIR /code
COPY ./docker_req.txt /code/docker_req.txt
RUN pip install --no-cache-dir --upgrade -r /code/docker_req.txt
COPY ./app /code/app
CMD ["uvicorn", "app.main:app", "--reload", "--host", "0.0.0.0"]
Run Code Online (Sandbox Code Playgroud)
运行容器时在 cmd 上输出:-
docker run --name my-app1 python-fastapi:1.5
INFO: Will watch for changes in these directories: ['/code']
INFO: …Run Code Online (Sandbox Code Playgroud) 在基于 FastAPI 的 Web 应用程序中,我有一个 WebSocket 端点,仅当满足某些条件时才应允许连接,否则它应返回答复HTTP 404而不是升级与HTTP 101.
据我了解,协议完全支持这一点,但我找不到任何方法可以使用 FastAPI 或 Starlette 来做到这一点。
如果我有类似的东西:
@router.websocket("/foo")
async def ws_foo(request: WebSocket):
if _user_is_allowed(request):
await request.accept()
_handle_ws_connection(request)
else:
raise HTTPException(status_code=404)
Run Code Online (Sandbox Code Playgroud)
该异常不会转换为 404 响应,因为 FastAPIExceptionMiddleware似乎无法处理此类情况。
是否有任何本机/内置方式支持这种“拒绝”流程?
我将 FastAPI 与 SQLModel 结合使用,它基于 pydantic、SQLAlchemy 和类型提示。我正在尝试创建一个BitInteger(int64就足够了)专栏。我怎么做?
我的 sql 模型声明看起来像这样
class ItemBase(sqlmodel.SQLModel):
name: str
price: int
class Item(ItemBase, table=True):
id: int = sqlmodel.Field(default=None, primary_key=True)
class ItemCreate(ItemBase):
pass
Run Code Online (Sandbox Code Playgroud)
提前致谢!
我发现如何使用 FastAPI 将 numpy 数组作为图像返回?然而,我仍然在努力展示图像,它看起来只是一个白色的方块。
io.BytesIO我像这样读入一个数组:
def iterarray(array):
output = io.BytesIO()
np.savez(output, array)
yield output.get_value()
Run Code Online (Sandbox Code Playgroud)
在我的端点中,我的回报是StreamingResponse(iterarray(), media_type='application/octet-stream')
当我留空media_type以推断时,会下载一个 zip 文件。
如何将数组显示为图像?