django通用视图通俗讲解,django详细教程

  django通用视图通俗讲解,django详细教程

  view函数(类),简称view,是一个简单的Python函数(类),接受Web请求并返回Web响应。

  响应可以是网页的HTML内容、重定向、404错误、XML文档或图像。

  无论视图本身包含什么逻辑,都应该返回一个响应。代码写在哪里并不重要,只要它在您当前的项目目录下。除此之外,没有更多的要求。——可以说是“没什么神奇的”。为了将代码放在某个地方,通常将视图放在项目或应用程序目录中名为views.py的文件中。

  简单视图下面是一个以HTML文档形式返回当前日期和时间的视图:

  从django.http导入HttpResponse

  导入日期时间

  定义当前日期时间(请求):

  now=datetime.datetime.now()

  html= html body现在是%s. /body /html % now

  返回HttpResponse(html)

  让我们一行一行地解释上面的代码:

  首先,我们从django.http模块和Python的datetime库导入了HttpResponse类。然后,我们定义current_datetime函数。它是视图功能。每个视图函数使用一个Httprequest对象作为它的第一个参数,它通常被称为request。

  注意,视图函数的名称并不重要;它不需要以统一的方式命名,以便Django可以识别它。我们把它命名为current_datetime,因为这个名字可以准确地反映它的功能。该视图将返回一个HttpResponse对象,其中包含生成的响应。每个视图函数负责返回一个HttpResponse对象。Django使用请求和响应对象在系统中传递状态。

  当浏览器向服务器请求页面时,Django创建一个HttpRequest对象,其中包含关于请求的元数据。然后,Django加载相应的视图,并将这个HttpRequest对象作为第一个参数传递给视图函数。

  每个视图负责返回一个HttpResponse对象。

  CBV和FBV我们以前写过基于功能的观点,这叫做FBV。您也可以将视图编写为基于类的。

  以我们之前提到的添加类为例:

  FBV版本:

  # FBV版增加班级

  定义添加类(请求):

  if request.method==POST :

  class_name=请求。POST.get(class_name )

  模特。classes . objects . create(name=class _ name)

  返回重定向(/class_list/)

  return render(请求, add_class.html )

  CBV版本:

  # CBV版增加班级

  从django.views导入视图

  class AddClass(视图):

  def get(自身,请求):

  return render(请求, add_class.html )

  定义发布(自己,请求):

  class_name=请求。POST.get(class_name )

  模特。classes . objects . create(name=class _ name)

  返回重定向(/class_list/)

  注意:

  使用CBV时,urls.py也会做相应的修改:

  # urls.py

  url(r^add_class/$,观点。AddClass.as_view()),

  装饰风景。用装饰器装饰FBVFBV本身就是一个函数,所以这和给普通函数添加一个装饰器是一样的:

  定义包装器(函数):

  def inner(*args,**kwargs):

  start_time=time.time()

  ret=func(*args,**kwargs)

  end_time=time.time()

  打印(已用:,结束时间-开始时间)

  返回ret

  返回内部

  # FBV版增加班级

  @包装

  定义添加类(请求):

  if request.method==POST :

  class_name=请求。POST.get(class_name )

  模特。classes . objects . create(name=class _ name)

  返回重定向(/class_list/)

  return render(请求, add_class.html )

  用装饰器装饰CBV类中的方法与独立函数不完全相同,所以我们不能直接将函数装饰器应用于类中的方法。我们需要先把它转换成一个方法装饰器。

  Django中提供了method_decorator decorator,用于将函数decorator转换为方法decorator。

  # CBV版增加班级

  从django.views导入视图

  从django . utils . decorator导入method_decorator

  class AddClass(视图):

  @method_decorator(包装器)

  def get(自身,请求):

  return render(请求, add_class.html )

  定义发布(自己,请求):

  class_name=请求。POST.get(class_name )

  模特。classes . objects . create(name=class _ name)

  返回重定向(/class_list/)

  #使用CBV时,需要注意的是,dispatch()方法会在请求到来后首先执行。如果需要对特定的请求处理方法做一些操作,比如get、post等。在批处理中,这里我们可以手动重写dispatch方法,这与向FBV添加装饰器的效果相同。

  班级登录(查看):

  定义调度(自身,请求,*参数,*kwargs):

  打印(“之前”)

  obj=super(登录,自己)。派遣(请求,*参数,*克沃格)

  打印(“之后”)

  返回对象

  def get(自身,请求):

  返回render(请求, login.html )

  定义发布(自己,请求):

  打印(请求。POST.get(user ))

  返回HttpResponse(Login.post )关于CBV的延伸阅读

  请求对象当一个页面被请求时,Django会创建一个包含这个请求的原始信息的HttpRequest对象。

  Django会自动将这个对象传递给响应视图函数。通常,视图函数通常使用请求参数来处理这个对象。

  公文

  请求的相关公共值path_info返回用户访问url,不包括域名方法请求中使用的HTTP方法的字符串表示,全部大写。GET类字典对象包含所有HTTP GET参数POST类字典对象包含所有HTTP POST参数体请求体,请求的数据为字节类型。POST是从正文中提取的属性。除非另有说明,否则所有属性都应被视为只读。

  属性:

  Django将请求消息中的请求行、头信息和内容体封装到HttpRequest类的属性中。

  除非另有说明,否则其他都是只读的。

  0.HttpRequest.scheme

  表示所请求方案的字符串(通常是http或https)

  1.HttpRequest.body

  表示请求消息正文的字符串。在处理非HTTP消息时非常有用,比如二进制图像、XML、Json等。

  但是,如果要处理表单数据,建议使用HttpRequest.POST。

  另外,我们也可以用python的类文件方法来操作它。详情请参考HttpRequest.read()。

  2.HttpRequest.path

  一个字符串,表示请求的路径组件(不包括域名)。

  例如:“/music/bands/the _ beats/”

  3.HttpRequest.method

  一个字符串,表示请求使用的HTTP方法。必须大写。

  示例:“获取”、“发布”

  4.HttpRequest.encoding

  一个字符串,表示提交数据的编码方式(如果为None,则表示使用DEFAULT_CHARSET的设置,默认为 utf-8 )。

  此属性是可写的,您可以修改它来修改用于访问表单数据的编码。

  对该属性的任何后续访问(如从GET或POST读取数据)都将使用新的编码值。

  如果您知道表单数据的编码不是DEFAULT_CHARSET,请使用它。

  5.HttpRequest . GET

  一个类似字典的对象,包含HTTP GET的所有参数。有关详细信息,请参考QueryDict对象。

  6.HttpRequest.POST

  一个类似于字典的对象,如果请求包含表单数据,它会将数据封装到一个QueryDict对象中。

  该请求可以具有空的POST字典——。如果表单是通过HTTP POST方法发送的,但是表单中没有数据,则仍然会创建QueryDict对象。

  因此,如果要求话。不应使用POST来检查是否使用了POST方法;您应该使用if request.method==POST

  此外,如果您使用POST上传文件,文件信息将包含在文件属性中。

  7.COOKIES

  包含所有cookie的标准Python字典。键和值都是字符串。

  8.文件

  一个类似于字典的对象,包含所有上传的文件信息。

  文件中的每一个键都是输入type=file name=/中的名称,值是对应的数据。

  请注意,只有当请求的方法是POST并且提交的表单具有enctype=multipart/form-data 时,文件才可用

  包括数据。否则,文件将是一个空的类似字典的对象。

  9.HttpRequest.META

  一个标准的Python字典,包含所有的HTTP头。的具体标头信息取决于客户端和服务器。以下是一些例子:

  CONTENT_LENGTH ——请求体的长度(字符串)。

  请求体的MIME类型。

  HTTP_ACCEPT ——响应可接受的内容类型。

  Http _ accept _ encoding3354响应的可接受编码。

  HTTP_ACCEPT_LANGUAGE ——响应的可接受语言。

  HTTP_HOST ——客服发送的HTTP主机头。

  HTTP_REFERER ——引用页面。

  HTTP_USER_AGENT ——客户端的用户代理字符串。

  QUERY_STRING ——单个字符串形式的查询字符串(未解析形式)。

  远程_ADDR ——客户端的IP地址。

  REMOTE_HOST ——客户端的主机名。

  服务器的REMOTE_USER ——认证用户。

  REQUEST_METHOD ——一个字符串,如“GET”或“POST”。

  SERVER_NAME ——服务器的主机名。

  SERVER_PORT ——服务器的端口(是一个字符串)。

  从上面可以看出,当请求中的任何HTTP头转换成除CONTENT_LENGTH和CONTENT_TYPE之外的META的键时,

  大写所有字母,用下划线替换连接符,后跟HTTP_ prefix。

  所以,一个名为X-Bender的头将被转换成META中的HTTP_X_BENDER键。

  10.HttpRequest.user

  表示当前登录用户的AUTH_USER_MODEL类型的对象。

  如果用户当前未登录,用户将被设置为django . contrib . auth . models . anonymous用户的实例。可以通过is_authenticated()来区分它们。

  例如:

  if request . user . is _ authenticated():

  #为登录用户做点什么。

  否则:

  #为匿名用户做点什么。

  仅当Django启用了AuthenticationMiddleware中间件时,用户才可用。

  -

  匿名用户

  班级模型。匿名用户

  django . contrib . auth . models . anonymous用户类实现了django . contrib . auth . models . user接口,但它有以下区别:

  Id始终为None。

  用户名总是空字符串。

  Get_username()总是返回空字符串。

  Is_staff和is_superuser始终为False。

  Is_active始终为False。

  组和user_permissions始终为空。

  Is_anonymous()返回True而不是False。

  Is_authenticated()返回False而不是True。

  Set_password()、check_password()、save()和delete()会引发NotImplementedError。

  Django 1.8中的新功能:

  添加AnonymousUser.get_username()更好地模拟django . contrib . auth . models . user。

  11.HttpRequest.session

  可读写的类似字典的对象,表示当前会话。仅当Django启用会话支持时可用。

  如需完整的详细信息,请参阅进程的文档。属性相关性

  上传文件示例

  定义上传(请求):

  在上传文件之前,数据需要存储在某个地方。当默认上传文件小于2.5M时,django会将上传文件的所有内容读入内存。从内存读取一次,写入磁盘一次。

  但是,当上传的文件非常大时,django会将上传的文件写入一个临时文件,然后存储在系统的临时文件夹中。

  :参数请求:

  :返回:

  if request.method==POST :

  #从请求的文件中获取上传文件的文件名,其中file是页面上输入的type=files类型的name属性值。

  文件名=请求。文件[文件]。名字

  #在项目目录中创建新文件

  用open(文件名, wb )作为f:

  #从上传的文件对象中一点一点地读取

  对于请求中的块。文件[文件]。组块():

  #写入本地文件

  f.write(块)

  返回HttpResponse (Upload OK )上传文件示例代码

  方法

  1.HttpRequest.get_host()

  根据HTTP_X_FORWARDED_HOST(如果USE_X_FORWARDED_HOST打开,默认为False)和HTTP_HOST头信息,返回请求的原始主机。

  如果这两个头没有提供相应的值,则使用SERVER_NAME和SERVER_PORT,这在PEP 3333中有详细描述。

  USE_X_FORWARDED_HOST:一个布尔值,指定是否先使用X-Forwarded-Host头,只有在代理设置了此头的情况下才能使用。

  例如:“127.0.0.1:8000”

  注意:当主机位于多个代理之后时,get_host()方法将失败。除非用中间件重写代理的头。

  2.HttpRequest.get_full_path()

  返回路径,如果可以将查询字符串添加到。

  例如:/music/bands/the _ beats/? print=true

  3.http request . get _ signed _ cookie(key,default=RAISE_ERROR,salt= ,max_age=None)

  返回与签名的Cookie相对应的值,或者如果签名不再合法,则返回django . core . signing . bad signature。

  如果提供了default参数,将不会引发任何异常,并将返回default值。

  可选salt参数可用于提供针对安全密钥强力攻击的额外保护。max_age参数用于检查对应于Cookie的时间戳,以确保Cookie的时间不会超过max_age秒。

  复制代码

  request . get _ signed _ cookie( name )

  托尼的

  request . get _ signed _ cookie( name ,salt=name-salt )

  假设设置cookie时使用相同的盐。

  request.get_signed_cookie(不存在的cookie )

  .

  错误:“不存在的cookie”#没有相应的密钥时会触发异常。

  request . get _ signed _ cookie( non-existing-cookie ,False)

  错误的

  request.get_signed_cookie(被篡改的cookie )

  .

  错误签名:

  request . get _ signed _ cookie( name ,max_age=60)

  .

  签名过期:签名年龄1677.39159 60秒

  request . get _ signed _ cookie( name ,False,max_age=60)

  错误的

  复制代码

  4.HttpRequest.is_secure()

  返回True请求时是否安全;也就是说,请求通过HTTPS启动。

  5.HttpRequest.is_ajax()

  如果请求是通过XMLHttpRequest发起的,则通过检查HTTP_X_REQUESTED_WITH的对应头是否是字符串“XMLHttpRequest”来返回True。

  大多数现代JavaScript库都发送这个头。如果您编写自己的XMLHttpRequest调用(在浏览器端),则必须手动设置该值才能使is_ajax()工作。

  如果响应需要基于请求是否通过AJAX发起,并且您使用了某种形式的缓存,比如Django的缓存中间件,

  您应该用Vary _ on _ headers( http _ x _ requested _ with )来修饰您的视图,以便可以正确地缓存响应。请求相关方法

  注意:当键值对有多个值时,比如复选框类型的输入标记和选择标记,需要使用:

  请求。POST.getlist(爱好)

  相比Django自动创建的HttpRequest对象,HttpResponse对象是我们负责的。我们编写的每个视图都需要实例化、填充并返回一个HttpResponse。

  HttpResponse类位于django.http模块中。

  使用密码字符串

  从django.http导入HttpResponse

  response=HttpResponse(这是网页的文本。)

  Response=httpresponse(请只显示文本。,content _ type= text/plain )设置或删除响应标头信息。

  response=HttpResponse()

  响应[ Content-Type ]= text/html;charset=UTF-8

  Del response[Content-Type]属性HttpResponse.content:响应内容

  charset:响应内容的编码

  HttpResponse.status_code:响应的状态代码。

  JsonResponse对象JsonResponse是HttpResponse的一个子类,专门用于生成JSON编码的响应。

  从django.http导入JsonResponse

  response=JSON response({ foo : bar })

  打印(响应.内容)

  b{foo: bar}

  默认情况下,只能传递字典类型。如果要传递非字典类型,需要设置safe keyword参数。

  response=JsonResponse([1,2,3],safe=False)

  Django快捷函数的官方文档

  渲染()

  将给定的模板与给定的上下文字典组合,并返回呈现的HttpResponse对象。

  参数:

  请求:用于生成响应的请求对象。

  Template_name:要使用的模板的全名,可选参数。

  上下文:添加到模板上下文中的字典。默认情况下是一个空字典。如果字典中的值是可调用的,视图将在呈现模板之前调用它。

  Content_type:用于生成的文档的MIME类型。DEFAULT_CONTENT_TYPE的值集。默认为“文本/html”

  状态:回应的状态代码。默认值为200。

  使用:用于加载模板的模板引擎的名称。一个简单的例子:

  从django.shortcuts导入渲染

  定义我的视图(请求):

  #视图的代码写在这里

  render (request, myapp/index.html ,{foo: bar})上面的代码等于:

  从django.http导入HttpResponse

  来自django.template导入加载程序

  定义我的视图(请求):

  #视图代码写在这里

  t=loader . get _ template( myapp/index . html )

  c={foo: bar}

  返回HttpResponse(t.render(c,request))

  redirect()参数可以是:

  一个模型:它会调用模型的get_absolute_url()函数,一个带参数的视图:它会使用urlresolvers.reverse反向解析绝对或相对url的名称,并使用完整的URL作为重定向的位置。默认情况下,返回临时重定向;传递permanent=True可以返回永久重定向。

  示例:

  您可以以多种方式使用redirect()函数。

  传递一个具体的ORM对象(只要知道就行)

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

  快捷方式导入重定向

  定义我的视图(请求):

  .

  object=MyModel.objects.get(.)

  返回重定向(对象)

  传递视图的名称。

  定义我的视图(请求):

  .

  Return redirect (some-view-name ,foo= bar )传递要重定向到的特定URL。

  定义我的视图(请求):

  .

  返回重定向(/some/url/)当然也可以是完整的url。

  定义我的视图(请求):

  .

  返回重定向( 3358example.com/)默认情况下,redirect()返回临时重定向。上述所有表单都接收一个永久参数;如果设置为True,将返回永久重定向:

  定义我的视图(请求):

  .

  object=MyModel.objects.get(.)

  返回重定向(object,permanent=True)

  延伸阅读:

  对于普通用户来说,临时重定向(响应状态代码:302)和永久重定向(响应状态代码:301)没有区别。主要是针对搜索引擎的机器人。

  A页暂时重定向到B页,搜索引擎收录A页。

  页面a永久重定向到页面B,然后搜索引擎包括页面B.

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: