Python 在课堂上使用路线
我正试图作为一个类重写一些工作代码 最低工作代码:Python 在课堂上使用路线,python,flask,Python,Flask,我正试图作为一个类重写一些工作代码 最低工作代码: from flask import Flask app = Flask(__name__) @app.route("/1") def func_1(): return "view 1" @app.route("/2") def func_2(): return "view 2" app.run() 如何使用对象实例化期间定义的路由将其编写为类? 我只希望它干净:在实例化一个对象之后,我希望各个路由已经在工作,没有额外的
from flask import Flask
app = Flask(__name__)
@app.route("/1")
def func_1():
return "view 1"
@app.route("/2")
def func_2():
return "view 2"
app.run()
如何使用对象实例化期间定义的路由将其编写为类?
我只希望它干净:在实例化一个对象之后,我希望各个路由已经在工作,没有额外的代码行
这是我最接近的地方:
from flask import Flask
class NewView:
def __init__(self, url, string):
self.string = string
self.server = Flask(__name__)
self.server.add_url_rule(url, 'index', self.index)
def index(self):
return self.string
v1 = NewView("/1", "view 1")
v2 = NewView("/2", "view 2")
v1.server.run()
当然,这会将/1
识别为v1.index()的路由,但/2
不起作用
理想的情况是类似于以下的东西,但我无法让它工作:
from flask import Flask
app = Flask(__name__)
class NewView:
def __init__(self, url, string):
....
app.add_url_rule(url, ...?..., self.index)
def index(self):
return self.string
v1 = NewView("/1", "view 1")
v2 = NewView("/2", "view 2")
app.run()
我认为,如果您的目标是保持代码干净,那么应该避免创建从未使用过的对象。flask中基于类的视图。正在传递的
as_view()
方法是类方法,因此这里也不需要创建从未使用过的对象。注册URL的过程属于应用程序的创建,而不是单独的对象(例如,Django就是这样工作的)。如果我是你,我会做类似的事情:
from flask import Flask
from flask.views import View
def init_app():
app = Flask(__name__)
app.add_url_rule('/', view_func=NewView.as_view('index'))
return app
class NewView(View):
def dispatch_request(self):
return 'Test'
app = init_app()
app.run()
首先,你的错误:
def __init__(self, url, string):
self.string = string
self.server = Flask(__name__)
self.server.add_url_rule(url, 'index', self.index)
因为这个类有两个实例,所以有两个Flask对象。你只运行第二个
您立即要做的事情可以这样做:
import flask
# There can be only one!
app = flask.Flask(__name__)
class MyView:
def __init__(self, url, name, string):
self.url = url
self.string = string
app.add_url_rule(url, name, self.serve)
def serve(self):
return self.string
view1 = MyView('/1', name='view1', string='This is View 1.')
view2 = MyView('/2', name='view2', string='This is View 2, not view 1.')
app.run()
上面的代码可以正常工作并实现您的期望。需要注意的是,因为Flask喜欢唯一路由的名称,所以我让您为每个路由传递一个名称。这样,url\u用于('view1')
和url\u用于('view2')
工作
话虽如此,社区已基本上完成了大部分工作。检查一下。我想你想要的东西在这里被记录下来了-在类外使用
添加url\u规则
和应用程序。添加url\u规则('/1',view\u func=NewView.as\u view('index'))
也许?@Simon Fraser,是的,这是可能的,但我想“包含”类内的所有内容以保持代码干净,添加url\u规则。我找不到一个简单的方法来做这件事。这些东西确实被使用过。我只是删除了所有没有意义的部分,去掉了这个例子。在我的例子中,每个对象都是一个Bokeh图。对于每个应用程序,都有一个请求数据更新的路由。我理解你的意思,注册url的过程属于应用程序的创建,但我认为可以为每个实例化对象动态添加一个新路由,该对象在init中将url作为参数传递。非常感谢。