Определение маршрутов вручную с помощью Flask
Я хочу определить маршруты вручную к какому-то методу классов, что-то вроде этого :
class X:
def route1():
#do stuff here
def route2():
#do stuff here
а затем сделайте что-то вроде этого :
app.add_url_rule('/x/', view_func=X.route1())
app.add_url_rule('/y/', view_func=X.route2())
это возможно?? Как правильно завершить это?
3 ответов
есть несколько способов сделать это:
-
создайте глобальный экземпляр своего класса и направьте к нему свои правила:
class X(object): # Your code here INSTANCE_X = X() # Note that we are not *calling* the methods app.add_url_rule('/x/', view_func=INSTANCE_X.route1) app.add_url_rule('/y/', view_func=INSTANCE_X.route2)
-
создайте экземпляр в функции view и делегируйте ему:
# Using both methods of registering URLs here # just to show that both work @app.route('/x/') def handle_route1(): return X().route1() def handle_route2(): return X().route2() app.add_url_rule('/y/', view_func=handle_route2)
-
наследовать от колбы
View
илиMethodView
Разъемный Вид классы и использоватьas_view
classmethod чтобы решить эту проблему ты:class X(View): methods = ['GET'] def dispatch_request(self): if request.path == '/x/': return route1() elsif request.path == '/y/': return route2() else: abort(404) app.add_url_rule('/x/', view_func=X.as_view('X.route1')) app.add_url_rule('/y/', view_func=X.as_view('X.route2'))
как я сказал в комментариях, вы знаете термос-классная?
из их примера:
from flask import Flask
from flask.ext.classy import FlaskView
# we'll make a list to hold some quotes for our app
quotes = [
"A noble spirit embiggens the smallest man! ~ Jebediah Springfield",
"If there is a way to do it better... find it. ~ Thomas Edison",
"No one knows what he can do till he tries. ~ Publilius Syrus"
]
app = Flask(__name__)
class QuotesView(FlaskView):
def index(self):
return "<br>".join(quotes)
def get(self, id):
id = int(id)
if id < len(quotes) - 1:
return quotes[id]
else:
return "Not Found", 404
QuotesView.register(app)
if __name__ == '__main__':
app.run()
будет автоматически генерировать маршруты для http://foobar.foo/quotes
и http://foobar.foo/quotes/<id>
если ты про flask
помощник декоратора,app.route(...)
, не забывайте, это просто декоратор, и вы всегда можете просто call
возвращенная обертка декоратора.
С ерундой, ничего не делать обертку, как,
def some_wrapper():
def wrapper(fn):
return fn()
return wrapper
когда вы обертываете func, как,
@some_wrapper
def some_func():
print('Hello World')
для всех намерений и целей, что может быть происходит
def some_func():
print('Hello World')
some_func = some_wrapper()(some_func)
Итак, из-за этого вы можете позвонить app.route
как вы можете в любое декоратор,
app.route('/x/')(X.route1)
это в конечном итоге делает то же самое, что и @sean-vieira в своем ответе - app.add_url_rule('/x/', view_func=INSTANCE_X.route1)
.
но одна из причин, по которой вы можете предпочесть это, заключается в том, что он следует "регулярному" пути колбы и документов колбы.
для моего использования я использую его для цепочки некоторых маршрутов, которые я добавляю программно,
suffix = 'ducky'
app.route(f'secure_initial_route_for_{suffix}', endpoint=f'secure_{suffix}')(
roles_required('admin')(secured_fn))
app.route(f'secure_sub_route_for_{suffix}', endpoint=f'secure_sub_{suffix}')(
roles_required('admin')(secured_sub_fn))
вот как я некоторые из моих случаев использования.