一、简介
视图是 Django 应用程序中的一种网页“类型”,通常提供特定功能并具有特定模板,在 Django 中,网页和其他内容是通过视图传递的。每个视图都由一个 Python 函数(或方法,在基于类的视图的情况下)表示。Django 将通过检查所请求的 URL 来选择一个视图(准确地说,是 URL 域名后面的部分)。
二、示例
#polls/views.py def detail(request, question_id): return HttpResponse("You're looking at question %s." % question_id) def results(request, question_id): response = "You're looking at the results of question %s." return HttpResponse(response % question_id) def vote(request, question_id): return HttpResponse("You're voting on question %s." % question_id)
#polls/urls.py from django.urls import path from . import views urlpatterns = [ # ex: /polls/ path('', views.index, name='index'), # ex: /polls/5/ path('<int:question_id>/', views.detail, name='detail'), # ex: /polls/5/results/ path('<int:question_id>/results/', views.results, name='results'), # ex: /polls/5/vote/ path('<int:question_id>/vote/', views.vote, name='vote'), ]
在浏览器中查看“/polls/34/”。它将运行该detail()
方法并显示您在 URL 中提供的任何 ID,当请求/polls/34/,Django 将加载mysite.urls
Python 模块,因为它是由设置指向的 ROOT_URLCONF
。它找到命名的变量urlpatterns
并按顺序遍历模式。在 找到匹配项后'polls/'
,它会删除匹配文本 ( "polls/"
) 并将剩余文本 - "34/"
- 发送到“polls.urls”URLconf 以进行进一步处理。在那里它匹配'<int:question_id>/'
,导致对detail()
视图的调用如下:
detail(request=<HttpRequest object>, question_id=34)
该question_id=34
部分来自<int:question_id>
. 使用尖括号“捕获”部分 URL 并将其作为关键字参数发送到视图函数。字符串的question_id
一部分定义将用于识别匹配模式的名称,该int
部分是一个转换器,用于确定哪些模式应该与这部分 URL 路径匹配。冒号 ( :
) 分隔转换器和模式名称。
三、cbv和fbv
FBV(function base views) 就是在视图里使用函数处理请求。
from django.http import HttpResponse def my_view(request): if request.method == 'GET': return HttpResponse('OK')
CBV(class base views) 就是在视图里使用类处理请求。
from django.http import HttpResponse from django.views import View class MyView(View): def get(self, request): return HttpResponse('OK')
四、使用装饰器
1、允许的http方法
require_http_methods
( request_method_list )
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 #根据请求方法限制对视图的访问 #请求方法应为大写 require_GET() #装饰器要求视图只接受 GET 方法。 require_POST()#装饰器要求视图只接受 POST 方法。 require_safe() #装饰器要求视图只接受 GET 和 HEAD 方法。
2、条件视图处理
#condition装饰器 #确定 HTTP 请求中的标头是否与资源上的标头匹配。如果它们不匹配,则必须计算资源的新副本并调用您的普通视图。 #1、etag_func #2、last_modified_func #当condition()返回一个条件响应时,它下面的任何装饰器都将被跳过并且不会应用于响应 condition(etag_func=None, last_modified_func=None)
3、GZip压缩
gzip_page()#如果浏览器允许 gzip 压缩,这个装饰器会压缩内容
4、改变标题
#django.views.decorators.vary可用于根据特定的请求标头控制缓存。 vary_on_cookie(函数) vary_on_headers( *标题)
5、缓存
django.views.decorators.cache控制服务器和客户端缓存中的装饰器。 cache_control( ** kwargs ) #这个装饰器通过添加所有关键字参数来修补响应的Cache-Control标题。 never_cache( view_func ) #这个装饰器Expires为当前日期/时间添加了一个标题。在响应中添加了一个标头,以指示一个页面永远不应该被缓存。Cache-Control: max-age=0, no-cache, no-store, must-revalidate, private #每个标头仅在尚未设置时才添加。
五、request对象
当一个页面被请求时,Django 会创建一个HttpRequest
包含请求元数据的对象。然后 Django 加载适当的视图,将HttpRequest
作为第一个参数传递给视图函数。每个视图负责返回一个HttpResponse
对象
1、对象
scheme #表示请求方案(http或https 通常)的字符串。 body #请求体,byte类型 request.POST的数据就是从body里面提取到的 path #表示请求页面的完整路径的字符串,不包括方案、域或查询字符串。 path_info #在某些 Web 服务器配置下,主机名之后的 URL 部分被拆分为脚本前缀部分和路径信息部分。path_info无论使用什么 Web 服务器,该属性始终包含路径的路径信息部分。使用它而不是path可以使您的代码更容易在测试和部署服务器之间移动。 method #表示请求中使用的 HTTP 方法的字符串。这保证是大写的 encoding #一个字符串,表示用于解码表单提交数据的当前编码 content_type #表示请求的 MIME 类型的字符串,从 CONTENT_TYPE标头中解析。 content_params #CONTENT_TYPE 标题中包含的键/值参数字典 GET #个类似字典的对象,包含所有给定的 HTTP GET 参数 POST #个类似字典的对象,包含所有给定的 HTTP POST 参数,前提是请求包含表单数据 COOKIES #包含所有 cookie 的字典。键和值是字符串 FILES #包含所有上传文件的类字典对象 META #包含所有可用 HTTP 标头的字典。可用的标头取决于客户端和服务器 headers #个不区分大小写的类 dict 对象,提供对请求中所有以 HTTP 为前缀的标头(加号Content-Length和Content-Type)的访问。 resolver_match #表示已解析 URL的实例。此属性仅在 URL 解析发生后设置,这意味着它在所有视图中可用,但在 URL 解析发生之前执行的中间件中不可用 current_app #url模板标签将使用它的值current_app 作为reverse(). urlconf #用作当前请求的根 URLconf,覆盖ROOT_URLCONF设置 session #From SessionMiddleware:一个可读可写的类字典对象,代表当前会话。 site #代表当前站点的或 返回 CurrentSiteMiddleware的实例 user #代表当前登录用户AuthenticationMiddleware的实例
2、方法
HttpRequest.get_host() #HTTP_X_FORWARDED_HOST使用(如果USE_X_FORWARDED_HOST启用)和HTTP_HOST标头中的信息按顺序返回请求的发起主机 HttpRequest.get_port() #HTTP_X_FORWARDED_PORT使用来自(如果USE_X_FORWARDED_PORT启用)和SERVER_PORT META变量的信息按顺序返回请求的发起端口 HttpRequest.get_full_path() #返回path HttpRequest.get_full_path_info() #喜欢get_full_path(),但使用path_info而不是 path HttpRequest.build_absolute_uri(位置=无) 返回 的绝对 URI 形式location。如果未提供位置,则位置将设置为request.get_full_path()。如果位置已经是绝对 URI,则不会更改。否则,绝对 URI 将使用此请求中可用的服务器变量构建 HttpRequest.get_signed_cookie(键,默认= RAISE_ERROR,盐= '',max_age =无) #返回签名 cookie 的 cookie 值, django.core.signing.BadSignature如果签名不再有效,则引发异常。如果您提供default参数,则异常将被抑制,而是将返回该默认值。 HttpRequest.is_secure() #True如果请求是安全的,则返回;也就是说,如果它是用 HTTPS 制作的。 HttpRequest.accepts( mime_type ) #True如果请求Accept标头与参数匹配,则返回mime_type HttpRequest.read(大小=无) HttpRequest.readline() HttpRequest.readlines() HttpRequest.__iter__()
六、querydict对象
这是一个字典子类,定制用于处理同一个键的多个值。
1、对象
QueryDict.__init__( query_string = None , mutable = False , encoding = None ) #实例化一个QueryDict基于 的对象query_string。 QueryDict.fromkeys(可迭代,值= '',可变=假,编码=无) #创建一个新QueryDict的,其中的键来自iterable且每个值都等于value QueryDict.__getitem__(关键) #返回给定键的值。如果键有多个值,则返回最后一个值。django.utils.datastructures.MultiValueDictKeyError如果键不存在则引发 QueryDict.__setitem__(键,值) #将给定键设置为[value](单个元素为 的列表 value)。请注意,这与其他具有副作用的字典函数一样,只能在可变的QueryDict(例如通过创建的QueryDict.copy())上调用。 QueryDict.__contains__(关键) #True如果设置了给定的键,则返回 QueryDict.get(键,默认=无) #与字典取值__getitem__()相同的逻辑,如果键不存在,则反回默认值。 QueryDict.setdefault(键,默认=无) #像dict.setdefault(),除了它在__setitem__()内部使用。 QueryDict.update( other_dict ) #像dict.update(),附加到当前字典项而不是替换它们 QueryDict.items() #dict.items(),除了它使用与相同的最后值逻辑 __getitem__()并返回迭代器对象而不是视图对象。 QueryDict.values() #dict.values(),除了它使用与相同的最后值逻辑 __getitem__()并返回迭代器而不是视图对象
2、方法
QueryDict.copy() #使用 . 返回对象的副本copy.deepcopy()。即使原件不是,这个副本也是可变的。 QueryDict.getlist(键,默认=无) #返回具有请求键的数据列表。如果键不存在并且default是,则返回一个空列表None。除非提供的默认值不是列表,否则保证返回列表。 QueryDict.setlist(键, list_ ) #将给定键设置为list_(与 不同__setitem__())。 QueryDict.appendlist(键,项) #将一个项目附加到与 key 关联的内部列表中。 QueryDict.setlistdefault(键,default_list =无) #像setdefault(),除了它需要一个值列表而不是单个值。 QueryDict.lists() #items(),除了它包含字典中每个成员的所有值 QueryDict.pop(关键 #返回给定键的值列表并将它们从字典中删除。KeyError如果键不存在则报错 QueryDict.popitem() #删除字典的任意成员(因为没有排序的概念),并返回一个包含键的二值元组和键的所有值的列表 QueryDict.dict() #返回 的dict表示形式QueryDict。对于 中的每个 (key, list) 对QueryDict,dict将具有 (key, item),其中 item 是列表的一个元素 QueryDict.urlencode(安全=无) #以查询字符串格式返回数据字符串
七、HttpResponse
对象
与HttpRequest
由 Django 自动创建的对象不同,编写的每个视图都负责实例化、填充和返回一个
HttpResponse
.
1、传递字符串用法
from django.http import HttpResponse response = HttpResponse("Here's the text of the web page.")
2、设置删除标题字段
response = HttpResponse() response.headers['Age'] = 120 del response.headers['Age'] #或者通过将响应视为字典来操作标头 response = HttpResponse() response['Age'] = 120 del response['Age']
3、属性
HttpResponse.content #表示内容的字节串,必要时从字符串编码。 HttpResponse.headers #一个不区分大小写的类 dict 对象,它为响应中的所有 HTTP 标头提供接口。请参阅设置标题字段。 HttpResponse.charset #一个字符串,表示将在其中编码响应的字符集。如果在HttpResponse实例化时没有给出,它将从中提取 content_type HttpResponse.status_code #这响应的HTTP 状态代码。 HttpResponse.reason_phrase #响应的 HTTP 原因短语。它使用HTTP 标准的默认原因短语。 存在此属性,因此中间件可以将流式响应与常规响应区别对待。 HttpResponse.closed #如果响应已关闭,返回True。
4、方法
HttpResponse.__init__( content = b'' , content_type = None , status = 200 , reason = None , charset = None , headers = None ) #HttpResponse使用给定的页面内容、内容类型和标题实例化一个对象。 #content最常见的是迭代器、字节memoryview串、 或字符串。其他类型将通过对其字符串表示进行编码来转换为字节串。迭代器应该返回字符串或字节串,它们将连接在一起形成响应的内容。 #content_type是可选的由字符集编码完成的 MIME 类型,用于填充 HTTPContent-Type标头。如果未指定,则由'text/html'和 DEFAULT_CHARSET设置组成,默认情况下: ."text/html; charset=utf-8" #status是个响应的HTTP 状态代码。您可以将 Pythonhttp.HTTPStatus用于有意义的别名,例如HTTPStatus.NO_CONTENT. #reason是 HTTP 响应短语。如果未提供,将使用默认短语。 #charset是响应将被编码的字符集。如果没有给出,它将从 中提取content_type,如果不成功,DEFAULT_CHARSET将使用该设置。 #headers是dict响应的 HTTP 标头。 HttpResponse.__setitem__(标题,值) #将给定的标头名称设置为给定的值。两者都header应该 value是字符串。 HttpResponse.__delitem__(标题) #删除具有给定名称的标头。如果标头不存在,则静默失败。不区分大小写。 HttpResponse.__getitem__(标题) #返回给定标头名称的值。不区分大小写。 HttpResponse.get(标题,备用=无) #返回给定标头的值,alternate如果标头不存在,则返回。 HttpResponse.has_header(标题) 返回True或False基于对具有给定名称的标头进行不区分大小写的检查。 HttpResponse.items() #类似于dict.items()响应上的 HTTP 标头。 HttpResponse.setdefault(标题,值) #除非已经设置,否则设置标题。 HttpResponse.set_cookie( key , value = '' , max_age = None , expires = None , path = '/' , domain = None , secure = False , httponly = False , samesite = None ) ¶ #设置一个cookie。Morsel参数与 Python 标准库中的 cookie 对象中的参数相同 。 #max_age应该是一个timedelta对象,一个整数秒,或者None(默认)如果 cookie 应该只持续与客户端的浏览器会话一样长。如果expires不指定,则计算。 #expires应该是格式中的字符串 或UTC 中的对象。如果是一个对象, 则将计算。"Wdy, DD-Mon-YY HH:MM:SS GMT"datetime.datetimeexpiresdatetimemax_age #如果domain要设置跨域 cookie HttpResponse.delete_cookie(键,路径= '/',域=无,相同站点=无) #使用给定键删除 cookie。如果密钥不存在,则静默失败。 HttpResponse.close() #该方法在请求结束时由 WSGI 服务器直接调用。 HttpResponse.write(内容) #此方法使HttpResponse实例成为类似文件的对象。 HttpResponse.flush() #此方法使HttpResponse实例成为类似文件的对象。 HttpResponse.tell() #此方法使HttpResponse实例成为类似文件的对象。 HttpResponse.getvalue() #返回 的值HttpResponse.content。此方法使HttpResponse实例成为类似流的对象。 HttpResponse.readable() #总是False。此方法使HttpResponse实例成为类似流的对象。 HttpResponse.seekable() #总是False。此方法使HttpResponse实例成为类似流的对象。 HttpResponse.writable() #总是True。此方法使HttpResponse实例成为类似流的对象。 HttpResponse.writelines(行) #将行列表写入响应。不添加行分隔符。此方法使HttpResponse实例成为类似流的对象。
5、子类
HttpResponseRedirect #构造函数的第一个参数是必需的——重定向到的路径。这可以是完全限定的 URL(例如'https://www.yahoo.com/search/')、没有域的绝对路径(例如'/search/'),甚至是相对路径(例如'search/')。在最后一种情况下,客户端浏览器将根据当前路径重建完整的 URL。请参阅HttpResponse其他可选的构造函数参数。请注意,这将返回 HTTP 状态代码 302。 url #此只读属性表示响应将重定向到的 URL(相当于Location响应标头)。 HttpResponsePermanentRedirect #类似HttpResponseRedirect,但它返回永久重定向(HTTP 状态代码 301)而不是“找到”重定向(状态代码 302)。 HttpResponseNotModified #构造函数不接受任何参数,也不应将任何内容添加到此响应中。使用它来指定自用户上次请求(状态代码 304)以来未修改页面。 HttpResponseBadRequest #行为类似HttpResponse,但使用 400 状态码。 HttpResponseNotFound #行为类似HttpResponse,但使用 404 状态码。 HttpResponseForbidden #行为类似HttpResponse,但使用 403 状态码。 HttpResponseNotAllowed #类似HttpResponse,但使用 405 状态码。构造函数的第一个参数是必需的:允许的方法列表(例如 )。['GET', 'POST'] HttpResponseGone #行为类似HttpResponse,但使用 410 状态码。 HttpResponseServerError #行为就像HttpResponse但使用 500 状态代码。
八、jsonresponse对象
类 JsonResponse(数据,编码器= DjangoJSONEncoder,安全= True, json_dumps_params =无, ** kwargs) ¶ HttpResponse有助于创建 JSON 编码响应的子类。它从其超类继承了大多数行为,但有几个不同之处: 它的默认Content-Type标头设置为application/json。 第一个参数data应该是一个dict实例。如果 safe参数设置为False,它可以是任何 JSON 可序列化对象。 encoder默认为 的django.core.serializers.json.DjangoJSONEncoder将用于序列化数据。 safe布尔参数默认True. 如果设置为 False,则可以传递任何对象进行序列化(否则只 dict允许实例)。如果safeisTrue并且一个非dict 对象作为第一个参数传递,TypeError则将报错。 json_dumps_params参数是传递给json.dumps()用于生成响应的调用的关键字参数字典。
标签:__,标头,HTTP,QueryDict,视图,django,HttpResponse From: https://www.cnblogs.com/songyunjie/p/16870776.html