views
- 视图即视图函数:接收web请求并返回web响应的事务处理函数
- 响应:指符合
http
协议要求的任何内容,包括json
string
html
等
简单视图
from django.http import *
给我们提供了很多类似于HttpResponse
的简单视图,通过ctrl+左键
点击django.http中的http可查看- 此类视图使用方法类似,可通过
return
语句返回,直接给浏览器 Http404
比较特殊是Exception
的子类,可以raise
使用,在处理函数中使用 raise Http404
语句引发
HttpResponse详解
- 服务器给浏览器的应答
- init:使用页内容实例化HttpResponse对象
- write(content):以文件的方式写
- flush():以文件的方式输出缓存区
- set_cookie(key, value=" ", max_age=None, expires=None):设置Cookie
- key, value都是字符串类型
- max_age是一个整数,表示在指定秒数后过期,与expires二选一
- expires是一个datetime或timedelta对象,将在这个指定的日期/时间后过期,与max_age二选一
- 如果不指定过期时间,则两个星期后过期
- delete_cookie(key):删除指定的key的cookie,如果key不存在则说明也不发生
HttpResponseRedirect详解
- 服务器给浏览器的应答
- 跳转,重新定向,服务器端跳转
- 构造函数的第一个参数用来指定重定向的地址
- 例子
url(r"v10_1/", views.v10_1),
url(r"v10_2/", views.v10_2),
url(r"v11/", views.v11, name="v11"),
from django.http import HttpResponse, HttpResponseRedirect
from django.core.urlresolvers import reverse
def v10_1(request):
return HttpResponseRedirect("/v11")
def v10_2(request):
return HttpResponseRedirect(reverse("v11"))
def v11(request):
return HttpResponse("我是v11")
Request详解
- 服务器接收浏览器的请求
- 介绍
- 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象
- 视图函数的第一个参数是HttpRequest对象
- 在django.http模块中定义了HttpRequest对象的API
- Request对象一般都是只读的,除非特殊说明
- 属性
- path:一个字符串,表示请求的页面的完整路径,不包含域名
- method:一个字符串,表示请求使用的HTTP方法,常用值包括
GET
POST
- encoding:一个字符串,表示提交数据的编码方式
- 如果为None则表示使用浏览器的默认值,一般为
utf-8
- 这个实行是可写的,可通过修改它的访问表单数据使用的编码,对属性修改
- GET:一个类似于字典的对象,包含GET请求方式的所有参数
- POST:一个类似于字典的对象,包含POST请求方式的所有参数
- FILES:一个类似于字典的对象,包含所有上传文件
- COOKIES:一个便准的python字典,包含所有的cookie,键和值都为字符串
- session:一个即可读有可写的类似于字典的对象,表示当前的会话,只有当django启用会话褒词的支持时才可用,详细内容见“状态保持”
- 方法
- is_ajax():如果请求是通过XMLHttpRequest发起的,则放回True
QueryDict对象
- 类似于字典,就像上面的GET属性
- 定义在django.http.QueryDict
- request对象的属性GET和POST都是QueryDict类型的对象
- 与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况,可以有多个值
- 方法get():根据键获取值
- 只能获取键的一个值
- 如果一个键同时拥有多个值,获取最后一个值
- 方法getlist():根据键获取值
GET属性
- QueryDict类型的对象
- 包含GET请求的所有参数
- 与url请求地址中的参数对应,位于?后面
- 参数的格式是键值对,如key=value
- 多个参数之间,使用
&
连接,如key1=value1&key2=value2 - 键是开发人员定下来的,值是可变的
from gongneng import views as gv
url(r"gt/", gv.do_gt)
def do_gt(request):
rst = ""
for i,n in request.GET.items():
rst += i + "->" + n
rst += ","
return HttpResponse("得到键值对为 {}".format(rst))
http://127.0.0.1:8000/gt/?名字=不告诉你&你愁啥=qie~瞅你咋地
得到键值对为 名字->不告诉你,你瞅啥->qie~瞅你咋地,
POST属性
- QueryDict类型的对象
- 包含post请求方式的所有属性
- 与from表单中的空间对应
- 表单中空间必须有name属性,name为键,value为值
- 键是开发人员定下来的,值是可变的
url(r"po_get/", gv.do_po_get),
url(r"po/", gv.do_po),
from django.shortcuts import render_to_response
def do_po_get(request):
return render_to_response("for_post.html")
def do_po(request):
rst = ""
for i,n in request.POST.items():
rst += i + "->" + n
rst += ","
return HttpResponse("得到的POST为 {}".format(rst))
'DIRS': [os.path.join(BASE_DIR, "templates")],
'gongneng',
'django.middleware.csrf.CsrfViewMiddleware',
#添加`./templates/for_post.html`
#私自添加的模板需修改`settings.py`
<html>
<head>
<title>Title</title>
</head>
<body>
<form method="post" action="/po/">
姓名:<input type="text" name="uname"/><br>
密码:<input type="password" name="upwd"/><br>
性别:<input type="radio" name="ugender" value="1"/>男
<input type="radio" name="ugender" value="0"/>女<br>
爱好:<input type="checkbox" name="uhobby" value="胸口碎大石"/>胸口碎大石
<input type="checkbox" name="uhobby" value="跳楼"/>跳楼
<input type="checkbox" name="uhobby" value="喝酒"/>喝酒
<input type="checkbox" name="uhobby" value="抽烟"/>抽烟<br>
<input type="submit" value="提交"/>
</form>
</body>
</html>
得到的POST为 uname->名,upwd->,ugender->1,uhobby->抽烟,
调试和正常运行切换
- 在调试时候,如果出错返回带信息的报错界面,以方便调试,正常工作中要返回标准的404界面,只需调整
setting.py
中的DEBUG = True
即可切换 - 如果修改
DEBUG = False
,就必须设置允许访问服务器的主机ALLOWED_HOSTS = []
,[]中填入"*"
就时所有都可以访问
render
- render(request, template_name, context=None, content_type=None, status=None, using=None)
- request:django的传入请求
- template_name:要使用的模板名称
- context:渲染模板所需要的数据,一般在request中,如果需要用到服务器中的数据,就添加到这里,默认是一个空字典
- content_type:生成的文档要使用的MIME类型. 默认为DEFAULT_CONTENT_TYPE设置的值. 默认为"text/html"
- status:响应的状态码. 默认为200
- useing:用于加载模板的模板引擎的名称
from gongneng import views as gv
url(r"render_test/", gv.do_render_test),
def do_render_test(request):
c = dict()
c["name"] = "你瞅啥~~!!"
c["age"] = "瞅你咋地~~!!"
rsp = render(request, "render.html", context=c)
return rsp
from django.template import loader
def do_render_test(request):
t =loader.get_template("render.html")
r = t.render({"name":"你瞅啥~~!!"})
return HttpResponse(r)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>title</title>
</head>
<body>
<h1>
得到的名字为 {{name}}
得到的年龄为 {{age}}
</h1>
</body>
</html>
render_to_response
- render_to_response(template_name, context=None, content_type=None, status=None, using=None)
- template_name:要使用的模板名称
- context:渲染模板所需要的数据,一般在request中,如果需要用到服务器中的数据,就添加到这里,默认是一个空字典
- content_type:生成的文档要使用的MIME类型. 默认为DEFAULT_CONTENT_TYPE设置的值. 默认为"text/html"
- status:响应的状态码. 默认为200
- useing:用于加载模板的模板引擎的名称
区别
- render 自动使用RequestContext
- render_to_responser 必须手动coding进去
render(request, "render.html", context={"name":"你瞅啥~~!!", "age":"瞅你咋地~~!!"})
render_to_responser("render.html", context={"name":"你瞅啥~~!!", "age":"瞅你咋地~~!!"},
context_instance=RequestContext(request))
系统内建视图
url(r"get404/", gv.do_get404),
from django.views import defaults
def do_get404(request):
return defaults.page_not_found(request, Exception)
404-页面未找到
ctrl
+左键点击 page_not_found
可看到 def page_not_found(request, template_name='404.html'):
- 可将
404.html
换成自己想呈现404页面 - 系统引发Http404时,可触发
- DEBUG=True 不会触发404,取而代之的时调试信息
- 404视图被传递一个RequestContext对象并且可以访问模板上下文处理器提供的变量
500-服务器内部错误
def server_error(request, template_name='500.html'):
- 需要DEBUG=False,否则不调用
403-权限报警
def permission_denied(request, template_name='403.html'):
- 通过permission_denied触发
400-错误请求报警
def bad_request(request, template_name='400.html'):
- DEBUG=False