03.django之视图函数
一、Django的视图函数
一个视图函数(类),是一个简单的python函数(类),它接收web请求并且相应
相应可以是HTML内容,可以是重定向,一个错误信息(例404),一张图片等
一个简单的视图
from django.http import HttpResponse def current(request): html = "11111" return HttpResponse(html)
""" 这个视图会返回一个HttpResponse对象,其中包含生成的响应。每个视图函数都负责返回一个HttpResponse对象。 Django使用请求和响应对象来通过系统传递状态。 当浏览器向服务端请求一个页面时,Django创建一个HttpRequest对象,该对象包含关于请求的元数据。然后,Django加载相应的视图,将这个HttpRequest对象作为第一个参数传递给视图函数。 每个视图负责返回一个HttpResponse对象。 """
二、CBV和FBV
""" FBV(function base views) 就是在视图里使用函数处理请求 CBV(function base views) 就是在视图里使用类处理请求 """
# cbv的优点 """ 1.提高了代码的复用性,可以使用面向对象的技术,比如mixin(多继承) 2. 可以用不同的函数针对不同的HTTP方法处理,而不是通过很多if判断,提高代码可读性 """
1、写一个GET方法请求的View
函数:
from django.http import HttpResponse def my_view(request): if request.method =='GET': return HttpResponse('ok')
类:
from django.http import HttpResponse from django.views import View class MyView(View): def get(self,request): return HttpResponse('ok')
理解cbv:
""" Django的url是将一个请求分配给可调用的函数的,而不是一个class。 针对这个问题,class-based view(CBV)提供了一个as_view()静态方法(也就是类方法), 调用这个方法,会创建一个类的实例,然后通过实例调用dispatch()方法, dispatch()方法会根据request的method的不同调用相应的方法来处理request(如get() , post()等)。 到这里,这些方法和function-based view差不多了,要接收request,得到一个response返回。 如果方法没有定义,会抛出HttpResponseNotAllowed异常。 """
对urls修改:
# urls.py from django.conf.urls import url from myapp.views import MyView #引入我们在views.py里面创建的类 urlpatterns = [ url(r'^index/$', MyView.as_view()), ]
url(r'^cv/(\d{2})/', views.Myd.as_view(),name='cv'), url(r'^cv/(?P\d{2})/ ', views.Myd.as_view(name='xxx'),name='cv'),#如果想给类的name属性赋值,前提你的Myd类里面必须有name属性(类属性,定义init方法来接受属性行不通,但是可以自行研究一下,看看如何行通,意义不大),并且之前类里面的name属性的值会被覆盖掉
类写法:
class Myd(View): name = 'sb' def get(self,request,n): print('get方法执行了') print('>>>',n) return render(request,'cvpost.html',{'name':self.name}) def post(self,request,n): print('post方法被执行了') return HttpResponse('post')
三、request请求对象
""" 当一个页面被请求时,Django就会创建一个包含本次请求原信息 (请求报文中的请求行、首部信息、内容主体等)的HttpRequest对象。 Django会将这个对象自动传递给响应的视图函数, 一般视图函数约定俗成地使用 request 参数承接这个对象。 """
1、请求相关的常用值
path_info 返回用户访问url,不包括域名
method 请求中使用的HTTP方法的字符串标识,全大写表示
GET 包括所有HTTP GET参数的类字典对象
POST 包括所有HTTP POST参数的类字典对象
boby 请求体,byte类型request.POST的数据就是从boby里面提取的
属性: django将请求报文中的请求行、头部信息、内容主体封装成 HttpRequest 类中的属性。 除了特殊说明的之外,其他均为只读的。 0.HttpRequest.scheme(后面再学) 表示请求方案的字符串(通常为http或https) 1.HttpRequest.body(后面再学) 一个字符串,代表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML,Json等。 但是,如果要处理表单数据的时候,推荐还是使用 HttpRequest.POST 。 另外,我们还可以用 python 的类文件方法去操作它,详情参考 HttpRequest.read() 。 2.HttpRequest.path 一个字符串,表示请求的路径组件(不含域名)。 例如:"/music/bands/the_beatles/" 3.HttpRequest.method 一个字符串,表示请求使用的HTTP 方法。必须使用大写。 例如:"GET"、"POST" 4.HttpRequest.encoding 一个字符串,表示提交的数据的编码方式(如果为 None 则表示使用 DEFAULT_CHARSET 的设置,默认为 'utf-8')。 这个属性是可写的,你可以修改它来修改访问表单数据使用的编码。 接下来对属性的任何访问(例如从 GET 或 POST 中读取数据)将使用新的 encoding 值。 如果你知道表单数据的编码不是 DEFAULT_CHARSET ,则使用它。 5.HttpRequest.GET 一个类似于字典的对象,包含 HTTP GET 的所有参数。详情请参考 QueryDict 对象。 6.HttpRequest.POST 一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。 POST 请求可以带有空的 POST 字典 —— 如果通过 HTTP POST 方法发送一个表单,但是表单中没有任何的数据,QueryDict 对象依然会被创建。 因此,不应该使用 if request.POST 来检查使用的是否是POST 方法;应该使用 if request.method == "POST" 另外:如果使用 POST 上传文件的话,文件信息将包含在 FILES 属性中。 7.HttpRequest.COOKIES 一个标准的Python 字典,包含所有的cookie。键和值都为字符串。 8.HttpRequest.FILES 一个类似于字典的对象,包含所有的上传文件信息。 FILES 中的每个键为"file" name="" /> 中的name,值则为对应的数据。 注意,FILES 只有在请求的方法为POST 且提交的