如何在Flask服务/帮助?

时间:2018-01-04 11:10:41

标签: python flask

我是Flask的新人。

现在我正在编写这样的路由方法:

@app.route("/categories")
def categories():
    return ""

如何在Flask中创建服务和全局帮助函数(类)以在每个路由方法中使用?应该上课吗?例如,我需要编写一个应该在某些路由方法中调用的公共函数handleCategories()

2 个答案:

答案 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