【问题标题】:Why does localhost:5000 not work in Flask?为什么 localhost:5000 在 Flask 中不起作用?
【发布时间】:2018-02-18 00:02:13
【问题描述】:

我正在使用烧瓶应用程序工厂模式,并拥有这个 run.py 文件:

from app import create_app

app = create_app()

if __name__ == '__main__':
    app.run(host='localhost', debug=True)

然后我像这样运行应用程序:

python run.py

但是当我转到http://localhost:5000 时,它不起作用。 它说:

找不到

在服务器上找不到请求的 URL。如果您输入了 URL 请手动检查您的拼写,然后重试。

可能出了什么问题?当我有 127.0.0.1 地址时它运行良好......

我需要在“localhost”上运行,因为我正在集成方支付,并且他们的沙箱设置需要我从“localhost”向他们的 API 发出请求。

另外,当我在浏览器中发出请求时,在终端上烧瓶响应时会出现这样的情况:

127.0.0.1 - - [09/Sep/2017 00:30:45] "GET / HTTP/1.1" 404 -
127.0.0.1 - - [09/Sep/2017 00:30:45] "GET /favicon.ico HTTP/1.1" 404 -
127.0.0.1 - - [09/Sep/2017 00:30:45] "GET /favicon.ico HTTP/1.1" 404 -

所以看起来请求到达了烧瓶,但烧瓶返回 404。

这是我的 init.py 文件的一部分:

# from __future__ import print_function


# import flask
from flask import Flask, render_template, url_for, redirect, flash, request, \
    session, current_app, abort
import os
# flask sqlaclhemy
from sqlalchemy import func, desc, asc, or_, and_

from flask_admin import Admin, AdminIndexView
from flask_admin.contrib.sqla import ModelView

# Flask secrutiy
from flask_security import (Security, SQLAlchemyUserDatastore, 
    login_required, current_user)
from flask_login import LoginManager
from flask_mail import Mail

# square connect setup
import uuid
import squareconnect
from squareconnect.rest import ApiException
# from squareconnect.apis.locations_api import LocationsApi
from squareconnect.apis.transactions_api import TransactionsApi




mail = Mail()

class CustomAdminIndexView(AdminIndexView):
    def is_accessible(self):
        return current_user.is_authenticated and current_user.has_role('admin')

def create_app():
    app = Flask(__name__)
    app.config.from_object(os.environ['APP_SETTINGS'])
    mail.init_app(app)
    from models import db, User, Role
    db.init_app(app)

    user_datastore = SQLAlchemyUserDatastore(db, User, Role)
    security = Security(app, user_datastore)

    @app.route('/')
    def home():
        return render_template('home.html')

    return app

【问题讨论】:

  • 你在用linux吗?
  • 您是否尝试过在调用 app.run(host='localhost', port=5000) 时传递显式端口?
  • 本地主机是否为您解析为 127.0.0.1? (例如通过主机文件条目)
  • 猫 /etc/hosts.同一行是否有 127.0.0.1 和 localhost 的条目?如果没有,请添加它。
  • 对,hosts文件中有一行:127.0.0.1 localhost

标签: python flask


【解决方案1】:

简单的替代解决方案是首先检查端口 5000 是否可用,您可以使用以下命令进行检查:

netstat -lat

了解更多关于可用端口 here 的信息: 如果您没有义务使用端口 5000,您可以尝试其他任何您想要的东西.. 如果一切正常,这意味着您的主页有问题,您没有到 '/' 的路由,这就是为什么您在访问 localhost:5000/ 时收到 404 错误的原因: 所以要纠正它,你有 3 个解决方案:

  1. 在您的 init.py 文件中添加 app.route('/')

  2. 创建应用后直接添加到你的run.py中(不是好办法)

  3. 尝试使用蓝图

由于您没有提供 init.py 代码,请将其添加到您的 run.py 中,

from app import create_app
app = create_app()
@app.route('/')
def homepage():
    return 'hello world'
if __name__ == '__main__':
    app.run(host='localhost', port=9874)

评论中建议的另一个解决方案是检查 127.0.0.1 是否解析为 localhost 通过键入此命令找到主机文件并检查您是否与我的行相同:

nano /etc/hosts

然后打开文件:

##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1       localhost
255.255.255.255 broadcasthost
::1             localhost

【讨论】:

  • 我在 hosts 文件中有一行 localhost。还尝试使用不同的端口。还是不行。
  • 我可以看到flask服务器接收到get请求,但仍然从flask返回404。
  • 如果你看到烧瓶服务器意味着你的服务器正在运行,告诉我你有回家的路线吗?告诉我你的视图功能。让我编辑答案
  • 您好,我编辑了问题并包含了我的 init.py 文件的一部分。我也尝试将它添加到 run.py 文件中,但仍然没有通过。它显示在烧瓶服务器日志中,但显示 404 not found :(
  • 好的,我想通了,我的 config.py 中有这个:SERVER_NAME = 'localhost',我删除了那行并且它起作用了。
【解决方案2】:

在您的主机文件中不会有 localhost 条目

示例主机文件

127.0.0.1       localhost

您可以通过以下方式检查您的主机文件

Linux 版

sudo vi /etc/hosts

适用于窗户

open this file C:\Windows\System32\Drivers\etc\hosts

如果您的主机文件中没有本地主机,请添加并保存它。

【讨论】:

  • 在 Windows 上,如果安装了 Docker Desktop,则映射会被它覆盖。我将映射改回 localhost 并且成功了。
【解决方案3】:

可能你需要安装虚拟环境

pip 安装虚拟环境

这样做。希望这有效

【讨论】:

  • 这是创建烧瓶项目时的好习惯。我要补充一点,还需要使用 $virtualenv ['filename'] 创建一个虚拟环境,但不确定这是否解决了 localhost 问题
【解决方案4】:

您应该尝试将localhost 换成0.0.0.0

if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)

这让它在本地主机上为我服务。

【讨论】:

    【解决方案5】:
    from flask import Flask
    app = Flask(__name__)
    

    @app.route("/") 定义你好(): 返回“你好” 如果 name == "ma​​in": app.run(host='0.0.0.0', port=9874)

    【讨论】:

    • from flask import Flask app = Flask(name) @app.route("/") def hello(): return "Hello" if name == "main": app.run(host='0.0.0.0', port=9874)
    • 提及(主机 ='localhost' 端口 = 5000)
    • 否则端口 = 9874
    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 2013-08-06
    • 2022-06-11
    相关资源
    最近更新 更多