笔记-django-视图

笔记-django-视图

1.      dispatch

1.1.    overview

To design URLs for an app, you create a Python module informally called a URLconf (URL configuration). This module is pure Python code and is a mapping between URL path expressions to Python functions (your views).

This mapping can be as short or as long as needed. It can reference other mappings. And, because it’s pure Python code, it can be constructed dynamically.

1.2.    django处理请求过程

When a user requests a page from your Django-powered site, this is the algorithm the system follows to determine which Python code to execute:

  1. Django determines the root URLconf module to use. Ordinarily, this is the value of the ROOT_URLCONF setting, but if the incoming HttpRequest object has a urlconf attribute (set by middleware), its value will be used in place of theROOT_URLCONF setting.指定根urlconf模板
  2. Django loads that Python module and looks for the variable urlpatterns. This should be a Python list of django.urls.path() and/or django.urls.re_path() instances.
  3. Django runs through each URL pattern, in order, and stops at the first one that matches the requested URL.按序匹配,找到第一个匹配项后返回。
  4. Once one of the URL patterns matches, Django imports and calls the given view, which is a simple Python function (or a class-based view). The view gets passed the following arguments:如果找到匹配模式,import and calls对应视图函数。视图函数接受以下参数:

An instance of HttpRequest.

If the matched URL pattern returned no named groups, then the matches from the regular expression are provided as positional arguments.

The keyword arguments are made up of any named parts matched by the path expression, overridden by any arguments specified in the optional kwargs argument to django.urls.path() or django.urls.re_path().

  1. If no URL pattern matches, or if an exception is raised during any point in this process, Django invokes an appropriate error-handling view. See Error handling below.如果没有可以匹配的模式或者出现异常,则调用异常处理视图函数。

1.3.    url匹配函数

匹配函数有两个path and re_path。

一个是普通匹配,一个是正则匹配。

注意:路由匹配只是路由匹配,而不管它是get,post或其它访求方式。

/example.com/myapp

/example.com/myapp/?page=3会匹配到同一个视图myapp/

1.4.    传参

from django.urls import path

from . import views

urlpatterns = [

    path('articles/2003/', views.special_case_2003),

    path('articles/<int:year>/', views.year_archive),

    path('articles/<int:year>/<int:month>/', views.month_archive),

    path('articles/<int:year>/<int:month>/<slug:slug>/', views.article_detail),

]

The following path converters are available by default:

str - Matches any non-empty string, excluding the path separator, '/'. This is the default if a converter isn’t included in the expression.

int - Matches zero or any positive integer. Returns an int.

slug - Matches any slug string consisting of ASCII letters or numbers, plus the hyphen and underscore characters. For example, building-your-1st-django-site.

uuid - Matches a formatted UUID. To prevent multiple URLs from mapping to the same page, dashes must be included and letters must be lowercase. For example, 075194d3-6885-417e-a8a8-6c931e272f00. Returns a UUID instance.

path - Matches any non-empty string, including the path separator, '/'. This allows you to match against a complete URL path rather than just a segment of a URL path as with str.

也可以自定义传参解析类并添加。

1.5.    路由分组

一个大网站的页面很多,不方便把所有路由条目放在同一个文件中,django为此提供支持。

from django.urls import include, path

urlpatterns = [

    # ... snip ...

    path('community/', include('aggregator.urls')),

    path('contact/', include('contact.urls')),

    # ... snip ...

]

2.      viewfuncions

2.1.    HttpResponse略

2.2.    Customizing error views

The default error views in Django should suffice for most Web applications, but can easily be overridden if you need any custom behavior. Simply specify the handlers as seen below in your URLconf (setting them anywhere else will have no effect).

The page_not_found() view is overridden by handler404:

handler404 = 'mysite.views.my_custom_page_not_found_view'

The server_error() view is overridden by handler500:

handler500 = 'mysite.views.my_custom_error_view'

The permission_denied() view is overridden by handler403:

handler403 = 'mysite.views.my_custom_permission_denied_view'

The bad_request() view is overridden by handler400:

handler400 = 'mysite.views.my_custom_bad_request_view'

这里只是重定义异常的视图函数指向,还需完善模板及视图函数。

注意:debug形状需要关掉,否则上列定义参数无法生效。

3.      djangoshortcut functions

3.1.1.   render

render()

render(request, template_name, context=None, content_type=None, status=None, using=None)

Combines a given template with a given context dictionary and returns an HttpResponse object with that rendered text.

参数释义:

request:The request object used to generate this response.

template_name:模板路径,如果给出一个序列,使用第一个有效的

context:变量传递

A dictionary of values to add to the template context. By default, this is an empty dictionary. If a value in the dictionary is callable, the view will call it just before rendering the template.

content_type

The MIME type to use for the resulting document. Defaults to the value of the DEFAULT_CONTENT_TYPE setting.

status

The status code for the response. Defaults to 200.

using

The NAME of a template engine to use for loading the template.

3.1.2.   redirect

redirect(to, permanent=False, *args, **kwargs)[source]

Returns an HttpResponseRedirect to the appropriate URL for the arguments passed.

The arguments could be:

A model: the model’s get_absolute_url() function will be called.

A view name, possibly with arguments: reverse() will be used to reverse-resolve the name.

An absolute or relative URL, which will be used as-is for the redirect location.

By default issues a temporary redirect; pass permanent=True to issue a permanent redirect.

参数可以是:

一个模型: 将调用模型的get_absolute_url()函数

一个视图, 可以带有函数: 可以使用urlresolvers.reverse来反向解析名称

一个绝对的或相对的URL, 将原封不动的作为重定向的位置.

默认返回一个临时的重定向, 传递permanent=True可以返回一个永久的重定向.

示例:

你可以用多种方式使用redirect()函数.

传递一个具体的ORM对象(了解即可).

将调用具体ORM对象的get_absolute_url()方法来获取重定向的URL.

from django.shortcuts import redirect

def my_view(request):

    ...

    object = MyModel.objects.get(...)

    return redirect(object)

传递一个视图的名称

def my_view(request):

    ...

    return redirect("some-view-name", foo="bar") 

传递要重定向到的一个具体的网址

def my_view(request):

    ...

    return redirect("/some/url/")

当然也可以是一个完整的网址

def my_view(request):

    ...

    return redirect("http://example.com")

默认情况下, redirect()返回一个临时重定向. 以上所有的形式都接收一个permanent参数; 如果设置为True, 将返回一个永久的重定向:

def my_view(request):

    ...

    object = MyModel.objects.get(...)

    return redirect(object, permanent=True)

4.      View decorators

Django provides several decorators that can be applied to views to support various HTTP features.

See Decorating the class for how to use these decorators with class-based views.

Allowed HTTP methods

The decorators in django.views.decorators.http can be used to restrict access to views based on the request method. These decorators will return a django.http.HttpResponseNotAllowed if the conditions are not met.

require_http_methods(request_method_list)[source]

Decorator to require that a view only accepts particular request methods. Usage:

from django.views.decorators.http import require_http_methods
 
@require_http_methods(["GET", "POST"])
def my_view(request):
    # I can assume now that only GET or POST requests make it this far
    # ...
    pass

Note that request methods should be in uppercase.

require_GET()

Decorator to require that a view only accepts the GET method.

require_POST()

Decorator to require that a view only accepts the POST method.

require_safe()

Decorator to require that a view only accepts the GET and HEAD methods. These methods are commonly considered “safe” because they should not have the significance of taking an action other than retrieving the requested resource.

Note

Web servers should automatically strip the content of responses to HEAD requests while leaving the headers unchanged, so you may handle HEAD requests exactly like GET requests in your views. Since some software, such as link checkers, rely on HEAD requests, you might prefer using require_safeinstead of require_GET.

Conditional view processing

The following decorators in django.views.decorators.http can be used to control caching behavior on particular views.

condition(etag_func=Nonelast_modified_func=None)[source]

etag(etag_func)[source]

last_modified(last_modified_func)[source]

These decorators can be used to generate ETag and Last-Modified headers; see conditional view processing.

GZip compression

The decorators in django.views.decorators.gzip control content compression on a per-view basis.

gzip_page()

This decorator compresses content if the browser allows gzip compression. It sets the Vary header accordingly, so that caches will base their storage on the Accept-Encoding header.

Vary headers

The decorators in django.views.decorators.vary can be used to control caching based on specific request headers.

vary_on_cookie(func)[source]

vary_on_headers(*headers)[source]

The Vary header defines which request headers a cache mechanism should take into account when building its cache key.

See using vary headers.

Caching

The decorators in django.views.decorators.cache control server and client-side caching.

cache_control(**kwargs)[source]

This decorator patches the response’s Cache-Control header by adding all of the keyword arguments to it. Seepatch_cache_control() for the details of the transformation.

never_cache(view_func)[source]

This decorator adds a Cache-Control: max-age=0, no-cache, no-store, must-revalidate header to a response to indicate that a page should never be cached.

猜你喜欢

转载自www.cnblogs.com/wodeboke-y/p/10757891.html