Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.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,我正试图作为一个类重写一些工作代码 最低工作代码: 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作为参数传递。非常感谢。