Flask在请求上下文之外工作。但我想我不是

2024-06-08 07:00:04 发布

您现在位置:Python中文网/ 问答频道 /正文

import flask
from flask import request
from pacfiletesterAPI import PacFileTester
from urlparse import urlparse
from flask import jsonify

app = flask.Flask(__name__)
#app.config["DEBUG"] = False

@app.route('/pac')
def pac():
    r = request.args.get('p')
    url = request.args.get('u')
    domain = request.args.get('d')
    Parsed_url = urlparse(url)
    Parsed_domain = urlparse(domain)
    if r == '':
        return "'not enough arguments, please provide a vaild url"
    elif url == '':
        if domain == '':
            return "'not enough arguments, please provide a vaild url"
    elif domain == '':
        if url == '':
            return "'not enough arguments, please provide a vaild domain"
        if Parsed_url.netloc == '':
            domain = Parsed_url.path.rstrip('/')
        else:
            domain = Parsed_url.netloc
    if not Parsed_url.scheme != 'http' or Parsed_url.scheme != 'https':
        url = 'https://' + domain

    result = PacFileTester(r, url, domain)
    return jsonify(result)

#app.run(host= '0.0.0.0')

if __name__ == "__main__":
    app.run(host= '0.0.0.0')

我可以使用pythonapi.py很好地运行该文件

但当我试着和服务员一起运行时,我得到了以下错误

waitress-serve --call 'api:pac'
Traceback (most recent call last):
  File "/usr/bin/waitress-serve", line 11, in <module>
    sys.exit(run())
  File "/usr/lib/python2.7/site-packages/waitress/runner.py", line 280, in run
    app = app()
  File "/var/www/html/cloud_test3/api.py", line 13, in pac
    r = request.args.get('p')
  File "/usr/lib/python2.7/site-packages/werkzeug/local.py", line 347, in __getattr__
    return getattr(self._get_current_object(), name)
  File "/usr/lib/python2.7/site-packages/werkzeug/local.py", line 306, in _get_current_object
    return self.__local()
  File "/usr/lib64/python2.7/site-packages/flask/globals.py", line 38, in _lookup_req_object
    raise RuntimeError(_request_ctx_err_msg)
RuntimeError: Working outside of request context.

This typically means that you attempted to use functionality that needed
an active HTTP request.  Consult the documentation on testing for
information about how to avoid this problem.

我的问题是,为什么我会犯这个错误。我不相信我是在请求上下文之外工作的。它似乎在dev服务器上按我所希望的方式工作,但在任何其他wsgi服务器上都不行。服务员是唯一一个给我这个错误的人


Tags: inpyimportappurlflaskgetreturn
2条回答

请参阅flask 文档中的topic

You need to tell Waitress about your application, but it doesn’t use FLASK_APP like flask run does. You need to tell it to import and call the application factory to get an application object.

$ waitress-serve  call 'myflaskapp:create_app'

这意味着waitress服务器无法加载带有此参数的Flask应用程序api:pac

服务器启动并运行后,您可以调用该端点,如:

http://localhost:8080/api/poc

最后,我建议您在开发Flask应用程序时使用最佳实践

看看这个topic关于如何使用app factory模式设置Flask应用程序,您可能知道python 2jan 2020开始就已经死了,不受支持,使用python 3并更新所有依赖项

import flask
from flask import request
from pacfiletesterAPI import PacFileTester
from urlparse import urlparse
from flask import jsonify

def create_app():
    app = flask.Flask(__name__)
    
    @app.route('/pac')
    def pac():
        r = request.args.get('p')
        url = request.args.get('u')
        domain = request.args.get('d')
        Parsed_url = urlparse(url)
        Parsed_domain = urlparse(domain)
        if r == '':
            return "'not enough arguments, please provide a vaild url"
        elif url == '':
            if domain == '':
                return "'not enough arguments, please provide a vaild url"
        elif domain == '':
            if url == '':
                return "'not enough arguments, please provide a vaild domain"
            if Parsed_url.netloc == '':
                domain = Parsed_url.path.rstrip('/')
            else:
                domain = Parsed_url.netloc
        if not Parsed_url.scheme != 'http' or Parsed_url.scheme != 'https':
            url = 'https://' + domain
    
        result = PacFileTester(r, url, domain)
        return jsonify(result)
    return app

我也有类似的问题,试着做类似的事情。当您由Waitess运行应用程序时,您只需调用一个名为“create_app”的函数,该函数包含您的所有flask应用程序。现在输入 waitress-serve call "<application_name>:create_app"

相关问题 更多 >

    热门问题