Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在烧瓶中提供服务/帮助?_Python_Flask - Fatal编程技术网

Python 如何在烧瓶中提供服务/帮助?

Python 如何在烧瓶中提供服务/帮助?,python,flask,Python,Flask,我是新来的 现在我正在对路由方法进行编码,如下所示: @app.route("/categories") def categories(): return "" from app.tasks import handle_categories @app.route("/categories") def categories(): result = handle_categories.delay(request.args) return "" 如何在Flask中创建服务

我是新来的

现在我正在对路由方法进行编码,如下所示:

@app.route("/categories")
def categories():
    return ""
from app.tasks import handle_categories

@app.route("/categories")
def categories():
    result = handle_categories.delay(request.args)
    return ""

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

如果要将应用程序构造成类,可以从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。在
中添加

如果你想将你的应用构造成一个类,你可以从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\u rule()
\uuu init\uuuu()
中,这就是。

同步服务

我通常在我的应用程序文件夹中有一个
utils.py
文件,我把所有库函数都放在那里

您甚至可以将Flask的
请求
对象传递给这些函数,以便访问HTTP请求上下文(url、方法、参数、args等)

在您的
应用程序/utils.py
中:

def handle_categories(request):
   args = request.args
   ...
   return result
from celery import task

@task
def handle_categories(args):
   # do something with args
   return result
from celery import Celery
app = Celery(__name__)
app.autodiscover_tasks(['app.tasks'])
然后,在代码中:

from flask import request
from app.utils import handle_categories

@app.route("/categories")
def categories():
    result = handle_categories(request)
    return ""
异步服务

有时,
app/utils.py
中的那些函数对于标准http请求来说花费的时间太长(并且您通常希望请求快速结束,以免阻塞您的Web服务器)

在这种情况下,您可以使用芹菜(
pip install芹菜
)异步运行它们

让我们在
app/tasks.py
中异步重写相同的函数。(注意,我们必须将
请求
对象作为参数删除,因为芹菜任务参数必须可序列化为JSON。)

app/tasks.py
中:

def handle_categories(request):
   args = request.args
   ...
   return result
from celery import task

@task
def handle_categories(args):
   # do something with args
   return result
from celery import Celery
app = Celery(__name__)
app.autodiscover_tasks(['app.tasks'])
然后,您可以这样调用任务:

@app.route("/categories")
def categories():
    return ""
from app.tasks import handle_categories

@app.route("/categories")
def categories():
    result = handle_categories.delay(request.args)
    return ""
要异步运行芹菜任务,您需要配置文件和辅助程序:

celeryapp.py

def handle_categories(request):
   args = request.args
   ...
   return result
from celery import task

@task
def handle_categories(args):
   # do something with args
   return result
from celery import Celery
app = Celery(__name__)
app.autodiscover_tasks(['app.tasks'])
运行worker:

celery worker -A celeryapp.app

同步服务

我通常在我的应用程序文件夹中有一个
utils.py
文件,我把所有库函数都放在那里

您甚至可以将Flask的
请求
对象传递给这些函数,以便访问HTTP请求上下文(url、方法、参数、args等)

在您的
应用程序/utils.py
中:

def handle_categories(request):
   args = request.args
   ...
   return result
from celery import task

@task
def handle_categories(args):
   # do something with args
   return result
from celery import Celery
app = Celery(__name__)
app.autodiscover_tasks(['app.tasks'])
然后,在代码中:

from flask import request
from app.utils import handle_categories

@app.route("/categories")
def categories():
    result = handle_categories(request)
    return ""
异步服务

有时,
app/utils.py
中的那些函数对于标准http请求来说花费的时间太长(并且您通常希望请求快速结束,以免阻塞您的Web服务器)

在这种情况下,您可以使用芹菜(
pip install芹菜
)异步运行它们

让我们在
app/tasks.py
中异步重写相同的函数。(注意,我们必须将
请求
对象作为参数删除,因为芹菜任务参数必须可序列化为JSON。)

app/tasks.py
中:

def handle_categories(request):
   args = request.args
   ...
   return result
from celery import task

@task
def handle_categories(args):
   # do something with args
   return result
from celery import Celery
app = Celery(__name__)
app.autodiscover_tasks(['app.tasks'])
然后,您可以这样调用任务:

@app.route("/categories")
def categories():
    return ""
from app.tasks import handle_categories

@app.route("/categories")
def categories():
    result = handle_categories.delay(request.args)
    return ""
要异步运行芹菜任务,您需要配置文件和辅助程序:

celeryapp.py

def handle_categories(request):
   args = request.args
   ...
   return result
from celery import task

@task
def handle_categories(args):
   # do something with args
   return result
from celery import Celery
app = Celery(__name__)
app.autodiscover_tasks(['app.tasks'])
运行worker:

celery worker -A celeryapp.app


我通常将我的常用代码放在一个单独的
lib
目录中并导入它。您是将包装器像一个类一样包含方法,还是只将方法放在单独的文件中?您可以共享自己的Flask Humanogy吗?我指的是项目的结构,其中包括服务、助手、模型、控制器、路由等。在Python中,除非它们存储状态,否则很少有理由将内容放入类中。除非它是我想在其他地方使用的公共类,否则我不会创建类。对于您的情况,只需模块中的一个函数就足够了。我通常将我的通用代码放在一个单独的
lib
目录中并导入它。您是将包装器像类一样使用,其中包含方法,还是只将方法放在单独的文件中?您可以共享自己的Flask Humanogy吗?我指的是项目的结构,其中包括服务、助手、模型、控制器、路由等。在Python中,除非它们存储状态,否则很少有理由将内容放入类中。除非它是我想在其他地方使用的公共类,否则我不会创建类。对于您的情况,模块中的一个函数就足够了。谢谢,我能用我自己的函数来延长烧瓶的生命周期吗?我的意思是在使用路由函数之前,首先在Flask中的某个地方调用我的函数?我是指以下情况,当用户来到网站时,系统检测到他的国家,然后下面的所有代码(db查询)根据检测到的国家工作,因此,总的来说,我的问题是如何在Flask上编写更面向对象的应用程序?我已经根据您所说的您试图实现的内容对示例进行了一些更新。谢谢,我应该在
MyFlaskApp
中编写API方法吗?使用装饰器?谢谢,我能用自己的功能延长烧瓶的寿命吗?我的意思是在使用路由函数之前,首先在Flask中的某个地方调用我的函数?我是指以下情况,当用户来到网站时,系统检测到他的国家,然后下面的所有代码(db查询)根据检测到的国家工作,因此,总的来说,我的问题是如何在Flask上编写更面向对象的应用程序?我已经根据您所说的您试图实现的内容对示例进行了一些更新。谢谢,我应该在
MyFlaskApp
中编写API方法吗?使用decorator?您还需要安装一个消息队列,如redis或rabbitmq。您还需要安装一个消息队列,如redis或rabbitmq。