我是Flask的新人。
现在我正在编写这样的路由方法:
@app.route("/categories")
def categories():
return ""
如何在Flask中创建服务和全局帮助函数(类)以在每个路由方法中使用?应该上课吗?例如,我需要编写一个应该在某些路由方法中调用的公共函数handleCategories()
。
答案 0 :(得分:1)
如果要将应用程序组织成类,可以从Flask类继承。
from flask import Flask
class MyFlaskApp(Flask):
def __init__(self):
super().__init__(__name__)
#You can add 'routes' with add_url_rule: which
# is the same as @app.route("/categories")
self.add_url_rule("/categories", "categories", self.categories)
def categories(self):
country = self.detect_country()
if country == "eng":
return "hello world"
if country == "fra":
return "bonjour monde"
return ""
def detect_country(self):
#some code to detect users county
return "eng"
要运行应用程序,请创建一个实例并在其上调用.run()
方法。
app = MyFlaskApp()
app.run()
使用此方法,您可以将路径逻辑编写为MyFlaskApp中的函数,而不是使用@app.route
装饰器。您需要在self.add_url_rule()
内使用.__init__()
,the same function @app.route
uses under the hood。
答案 1 :(得分:1)
同步服务
我的app文件夹中通常有一个utils.py
文件,我放了所有的库函数。
您甚至可以将Flask的request
对象传递给这些函数,以便您可以访问HTTP请求上下文(url,method,params,args,...)。
在app/utils.py
:
def handle_categories(request):
args = request.args
...
return result
然后,在您的代码中:
from flask import request
from app.utils import handle_categories
@app.route("/categories")
def categories():
result = handle_categories(request)
return ""
异步服务
有时app/utils.py
中的那些函数对于标准的http请求来说花费的时间太长(并且您通常希望请求以快速结束而不会使您的网络服务器膨胀)。
在这种情况下,您可以使用Celery(pip install celery
)异步运行它们。
让我们在app/tasks.py
中异步重写相同的函数。 (请注意,我们必须将request
对象作为参数删除,因为Celery任务参数必须可序列化为JSON。)
在app/tasks.py
:
from celery import task
@task
def handle_categories(args):
# do something with args
return result
然后你可以调用这样的任务:
from app.tasks import handle_categories
@app.route("/categories")
def categories():
result = handle_categories.delay(request.args)
return ""
要以异步方式运行Celery任务,您需要一个配置文件和一个worker:
celeryapp.py
:
from celery import Celery
app = Celery(__name__)
app.autodiscover_tasks(['app.tasks'])
运行worker:
celery worker -A celeryapp.app