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。