我正在使用Flask + gevent,并希望在greenlet flask.g
的目标函数内访问全局应用程序.我正在使用copy_current_request_context
装饰器,其情况与文档中给出的示例非常相似:
import gevent
from flask import copy_current_request_context, g
@app.route('/')
def index():
g.user_data = 'foobar'
g.more_user_data = 'baz'
@copy_current_request_context
def do_some_work():
some_func(g.user_data, g.more_user_data)
...
gevent.spawn(do_some_work)
return 'Regular response'
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
AttributeError: '_AppCtxGlobals' object has no attribute 'user_data'
Run Code Online (Sandbox Code Playgroud)
我认为在复制请求上下文时会推送新的应用程序上下文?我在烧瓶代码中设置跟踪在这里,这似乎是这样.因此,错误并不令人惊讶,因为该flask.g
对象的应用程序上下文的范围为0.10(请参阅http://flask.pocoo.org/docs/0.12/api/#flask.Flask.app_ctx_globals_class).
显然,我可以将用户数据作为参数传递给目标函数:
import gevent
from flask import g
@app.route('/')
def index():
g.user_data = 'foobar'
g.more_user_data = 'baz'
def do_some_work(user_data, more_user_data):
some_func(user_data, more_user_data)
...
gevent.spawn(do_some_work, g.user_data, g.more_user_data)
return 'Regular response'
Run Code Online (Sandbox Code Playgroud)
这很好用,但我希望尽可能使用flask.g
.
我正在Flask中编写一个RESTful API.我可以通过Request Object访问URL参数.验证给定URL参数的最佳方法是什么?
例如:
/places?zip=97239 # This is a valid filter
/places?foo=bar # This is not a valid filter, 404 response?
Run Code Online (Sandbox Code Playgroud)
一种解决方案是搜索request.args
并比较每个条目与一组有效的URL参数.有没有更好的办法?
谢谢!
这是我正在处理的内容:
/myproject
README.md
runserver.py
/myproject
__init__.py
api.py
/resources
__init__.py
foo.py
bar.py
/common
__init__.py
db.py
/tests
test_myproject.py
Run Code Online (Sandbox Code Playgroud)
这里没什么特别的。其中大部分内容可以在Flask-RESTful 用户指南的中级用法页面上找到。
我担心的是循环进口......
api.py
from flask import Flask
from flask_restful import Api
app = Flask(__name__)
from myproject.resources.foo import Foo
from myproject.resources.bar import Bar
api = Api(app)
api.add_resource(Foo, '/Foo', '/Foo/<str:id>')
api.add_resource(Bar, '/Bar', '/Bar/<str:id>')
Run Code Online (Sandbox Code Playgroud)
foo.py
from flask_restful import Resource
from myproject.common.db import query_db
class Foo(Resource):
def get(self):
pass
def post(self):
pass
Run Code Online (Sandbox Code Playgroud)
数据库.py
from flask import g
import sqlite3
from myproject.api import app
def get_db(): …
Run Code Online (Sandbox Code Playgroud)