视图函数介绍
http请求中的两个核心对象
- http请求:HttpRequest对象
- http响应:HttpResponse对象
位置:django,http
在视图函数中,request对象就是HttpRequest,可以用 isinstance(request, HttpRequest) 判断,结果为True
HttpRequest对象的属性和方法
属性
属性 | 说明 |
path | 请求页面的全路径,不包括域名 |
method | 请求中使用的HTTP方法的字符串表示。全大写表示,例如:POST GET |
GET | 包含所有HTTP GET参数的类字典对象 |
POST | 包含所有HTTP POST参数的类字典对象 |
COOKIES | 包含所有cookies的标准Python字典对象;keys和values都是字符串。 |
FILES | 包含所有上传文件的类字典对象 |
user |
是一个django.contrib.auth.models.User对象,代表当前登陆的用户。如果访问用户当前没有登陆,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。可以通过user的is_authenticated()方法来辨别用户是否登陆: |
session | 唯一可读写的属性,代表当前会话的字典对象;只有激活Django中的session支持时该属性才可用。 |
关于request.FILES
FILES中的每一个KEY都是<input type="file" name="" />标签中name属性的值,FILES中的每一个value同时也是一个标准的python字典对象,包含下面三个Keys:
- filename: 上传文件名,用字符串表示
- content_type: 上传文件的Content Type
- content: 上传文件的原始内容
方法
request.get_full_path():比如:http://127.0.0.1:8000/index33/?name=123 ,req.get_full_path()得到的结果就是/index33/?name=123,而request.path得到的是/index33
在request.POST中一个常用的方法:request.POST.getlist('name')
HttpResponse对象
页面渲染
render_to_response()
- 参数一:字符串类型,html文件的路径
- 参数二:字典类型,渲染到html页面的上下文对象
使用方式:
return render_to_response("index.html", {"name": name, "user": user})
render()
- 参数一:HttpRequest对象
- 参数二:字符串类型,html文件路径
- 参数三:字典类型,渲染到html页面的上下文对象
使用方式:
return render(request, "index.html", {"user": user, "pwd": pwd})
render()方法和render_to_response()方法的区别就是,传入的参数不一样 ,render_to_response()不用传入HttpRequest对象
页面跳转
redirect()
- 参数一:字符串对象,要跳转的URL路径
在登录的时候可以使用:
如果用户输入了正确的用户名跟密码,这个时候在视图函数中可以直接用render()返回一个登录页面,也可以用redirect()跳转到登录链接,那么这两种方法的区别是什么呢?
在使用render()返回一个登录页面的时候,浏览器的URL不会改变,还是登录的URL,这时用户只需要对准URL栏一个回车就又会回到登录页面,这显然不是希望看到的,所以在做类似的业务时用redirect()更加合适
locals()
可以直接将函数中所有的变量传给模板,包括request以及它的属性都能拿到,但是也是locals()被诟病的地方
使用方法:
return render(request, "index.html", locals()) # 不用再用字典一个一个的传了,在变量比较多的时候比较实用
CBV跟FBV
上面通过函数去处理结果的方式叫做FBV,其实,除了通过函数处理还可以通过类来处理,这种处理方式叫做CBV
首先在url中些路由映射时映射到指定的类
url("^index$", views.CBV.as_view())
然后书写相应的类
在书写类的时候应该继承View类,这样之后,通过该url过来的get请求会走get()方法,post请求会走post()方法
class CBV(View): def get(self, request): return HttpResponse("get") def post(self, request): return HttpResponse("post")
dispatch()方法
其实不管是post请求还是get请求或者其他的请求,在到达相应的方法之前会先走dispatch()方法,因此如果在post跟get请求处理前有还需要做什么处理可以在dispatch()方法中完成,就像装饰器一样
CBV中的请求方法: get post put patch delete head options trace