gpt4 book ai didi

python - Flask 模板在本地环境中工作,但在 nginx 下返回错误 404

转载 作者:太空宇宙 更新时间:2023-11-03 17:08:57 24 4
gpt4 key购买 nike

我已阅读答案[ https://stackoverflow.com/a/20895594/305883]但对我没有帮助。

我有一个 Flask 应用程序,可以在本地主机中提供模板或在端点 /path/<int:id>/ 进行调试,但在使用 nginx 的生产中,它将失败并出现错误 404

Flask 项目具有默认结构:

app.py
index.html
/templates/mytemplate.html
/static/..

mytemplate.html将从 /static/ 加载资源文件夹,使用 jinja 语法。

已编辑

目标:我希望应用程序能够运行:

  • /将提供index.html

  • /path/将打开“myTemplate.html”并用变量填充它(金贾);如果可能的话我希望模板中包含静态资源(例如js、css、图像)由 nginx 提供服务;

  • /api/将提供 api 休息。

在我的本地环境中,我使用的是 Flask 服务器,而不是 ningx,并且三个端点按预期工作。

在生产中,我使用flask和ningx。根和/api/边缘有效;/path/,用于 Flask 中的模板,不会并返回错误 404

为了设置 nginx,我按照本教程中的步骤进行操作:[https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-uwsgi-and-nginx-on-ubuntu-14-04]

flask 中的模板由以下人员提供:

@application.route('/path/<int:id>/')
def graph_template(id):
meta = {'og:image':'/url/image.jpg'}
try:
key = decode(id)[0]
except:
# todo replace with error 400
return jsonify({'error':'Something got wrong. ID not found'})
return render_template('mytemplate.html', meta=meta, id = id)

我在调试和发现问题时遇到困难,使得/path/显示模板。

nginx配置

server {
listen 80;

# is this block to serve index on root only ?
# or will search for index files also in routes /path/ in ningx and/or flask?
root /var/www/mySite;
index index.html index.htm;

location /api {
# try_files $uri $uri/ /index.html;
include uwsgi_params;
uwsgi_pass unix:/var/www/mySite/myApp.sock;

# auth_basic "API Login";
# auth_basic_user_file /etc/nginx/pw_file;
# allow 127.0.0.1;
# allow XX.XX.XXX.XXX;
# deny all;
}

location /static {
alias /var/www/mySite/static;
}

}

我尝试了以下方法:

包含 proxy_pass:

location / {
proxy_pass http://127.0.0.1:8080;
}

结果:导致错误502

尝试将端口更改为:80

location / {
proxy_pass http://127.0.0.1:80;
}

结果:错误 404

尝试在/path/端点使用 uwsgi_pass 套接字

location /path/ {
include uwsgi_params;
uwsgi_pass unix:/var/www/mySite/myApp.sock;
}

结果:该路由不存在 http://example.com/path/ 我不明白,因为 Flask 应该在这里提供模板 - 至少不是错误配置错误 502。

答案:[ Python Flask server crashing on GET request to specific endpoint:显示每个端点有两个套接字 - 我需要使用这样的设置吗?我正在尝试记录自己的套接字是什么并使用 nginx 文档,但抱歉我在这方面能力不强,而且我在黑暗中移动了一点。

你能帮忙调试一下这个问题吗?

最佳答案

耶!我自己找到了答案:

在 nginx 中添加此 block 可以使用 nginx 从 Flask 提供模板:

location /path/ {
include uwsgi_params;
uwsgi_pass unix:/var/www/mySite/myApp.sock;
}

哪里/path/是模板的端点。

我收到上面的消息是因为 Flask 实际上正在处理 404 错误,因为我编写了我的装饰器来命中 /path/<int:id>并处理 404 请求:

@application.errorhandler(404)
def page_not_found(error):
return 'This route does not exist {}'.format(request.url), 404

但是,如果有人可以添加一些注释来解释 Flask 和 nginx 之间的路由实际上是如何工作的,以及使用 uwsgi_pass 之间的区别,我将非常感激。和proxy_pass (我在不同的教程中找到了),以及套接字的使用(我遵循的教程)。

例如,在这个问题中[ Python Flask server crashing on GET request to specific endpoint:用户为每个端点使用两个套接字,对于我作为初学者来说,我认为这可能是问题所在,但事实并非如此。

  • 通过这个配置,我知道 Flask 将处理 .html 模板:它是否也处理模板中的资源(js、css)或者它们由 nginx 提供服务(请参阅上面的配置,所有资源都在/静态/文件夹)

  • 是否有更好的配置来利用 ningx 的功能来提供 Flask 模板?

非常感谢评论!

关于python - Flask 模板在本地环境中工作,但在 nginx 下返回错误 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34318653/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com