Class-Based Views โ
Changelog
New in version 0.7.
class
flask.views.View โ
Subclass this class and override dispatch_request()
to create a generic class-based view. Call as_view()
to create a view function that creates an instance of the class with the given arguments and calls its ยท method with any URL variables.
See Class-based Views for a detailed guide.
class Hello(View):
init_every_request = False
def dispatch_request(self, name):
return f"Hello, {name}!"
app.add_url_rule(
"/hello/<name>", view_func=Hello.as_view("hello")
)
class Hello(View):
init_every_request = False
def dispatch_request(self, name):
return f"Hello, {name}!"
app.add_url_rule(
"/hello/<name>", view_func=Hello.as_view("hello")
)
Set methods
on the class to change what methods the view accepts.
Set decorators
on the class to apply a list of decorators to the generated view function. Decorators applied to the class itself will not be applied to the generated view function!
Set init_every_request
to False
for efficiency, unless you need to store request-global data on self
.
classmethod
as_view(name, *class_args, **class_kwargs
) โConvert the class into a view function that can be registered for a route.
By default, the generated view will create a new instance of the view class for every request and call its
dispatch_request()
method. If the view class setsinit_every_request
toFalse
, the same instance will be used for every request.Except for
name
, all other arguments passed to this method are forwarded to the view class__init__
method.Changelog
Changed in version 2.2: Added the
init_every_request
class attribute.Parameters:
name (str)
โclass_args (t.Any)
โclass_kwargs (t.Any)
โ
Return type:
ft.RouteCallable
decorators:
ClassVar[list[Callable]] = []
โA list of decorators to apply, in order, to the generated view function. Remember that
@decorator
syntax is applied bottom to top, so the first decorator in the list would be the bottom decorator.Changelog
New in version 0.8.
dispatch_request() โ
The actual view function behavior. Subclasses must override this and return a valid response. Any variables from the URL rule are passed as keyword arguments.
Return type:
ft.ResponseReturnValue
init_every_request:
ClassVar[bool] = True
โCreate a new instance of this view class for every request by default. If a view subclass sets this to
False
, the same instance is used for every request.A single instance is more efficient, especially if complex setup is done during init. However, storing data on
self
is no longer safe across requests, andg
should be used instead.Changelog
New in version 2.2.
methods:
ClassVar[Collection[str] | None] = None
โThe methods this view is registered for. Uses the same default (
["GET", "HEAD", "OPTIONS"]
) as route andadd_url_rule
by default.provide_automatic_options:
ClassVar[bool | None] = None
โControl whether the
OPTIONS
method is handled automatically. Uses the same default (True
) asroute
andadd_url_rule
by default.
class
flask.views.MethodView โ
Dispatches request methods to the corresponding instance methods. For example, if you implement a get
method, it will be used to handle GET
requests.
This can be useful for defining a REST API.
methods
is automatically set based on the methods defined on the class.
See Class-based Views for a detailed guide.
class CounterAPI(MethodView):
def get(self):
return str(session.get("counter", 0))
def post(self):
session["counter"] = session.get("counter", 0) + 1
return redirect(url_for("counter"))
app.add_url_rule(
"/counter", view_func=CounterAPI.as_view("counter")
)
class CounterAPI(MethodView):
def get(self):
return str(session.get("counter", 0))
def post(self):
session["counter"] = session.get("counter", 0) + 1
return redirect(url_for("counter"))
app.add_url_rule(
"/counter", view_func=CounterAPI.as_view("counter")
)
dispatch_request(
**kwargs
) โ
The actual view function behavior. Subclasses must override this and return a valid response. Any variables from the URL rule are passed as keyword arguments.
Parameters:
kwargs (t.Any)
โ
Return type: ft.ResponseReturnValue