• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
菩提叶子
博客园    首页    新随笔    联系   管理    订阅  订阅
django视图

一、简介

视图是 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.urlsPython 模块,因为它是由设置指向的 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()用于生成响应的调用的关键字参数字典。

 

posted on 2022-11-08 18:36  菩提叶子  阅读(40)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3