Django-03-views

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详解

  • 服务器给浏览器的应答
  • 跳转,重新定向,服务器端跳转
  • 构造函数的第一个参数用来指定重定向的地址
  • 例子
#在urls中添加内容
url(r"v10_1/", views.v10_1),
url(r"v10_2/", views.v10_2),
url(r"v11/", views.v11, name="v11"),
#在views添加内容
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
  • 键是开发人员定下来的,值是可变的
#在urls中添加内容
from gongneng import views as gv
url(r"gt/", gv.do_gt)
#在views添加内容
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为值
    • checkbox存在一键多值的问题
  • 键是开发人员定下来的,值是可变的
#在urls中添加内容

url(r"po_get/", gv.do_po_get),
url(r"po/", gv.do_po),
#在views添加内容

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))
#settings.py改动

#`给django添加模板文件夹`
#改动`TEMPLATES`里的下面代码
'DIRS': [os.path.join(BASE_DIR, "templates")],

#我们新建的APP都是需要注册的,偶尔不注册也好用,但是尽量避免
#在`INSTALLED_APPS`中添加功能名
'gongneng',

#网页提交后,会有错误`403`的`CSRF`,是要给很出名的攻击手段,django自带防护
#我们这个例子需要暂时关掉
#把`MIDDLEWARE_CLASSES`下的这个项,注释掉
'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:用于加载模板的模板引擎的名称
#urls.py修改

from gongneng import views as gv
url(r"render_test/", gv.do_render_test),
#第一种views.py修改

def do_render_test(request):
    
    #环境变量
    c = dict()
    c["name"] = "你瞅啥~~!!"
    c["age"] = "瞅你咋地~~!!"

    #用`request`数据渲染`render.html`返回给`rsp`
    rsp = render(request, "render.html", context=c)

    return rsp
#第二种views.py修改

from django.template import loader

def do_render_test(request):

    #装载一个模板
    t =loader.get_template("render.html")
    
    #用`template`中的`render`方法渲染模板
    r = t.render({"name":"你瞅啥~~!!"})

    return HttpResponse(r) #强转`SafeText`类型为`HttpResponse`类型
#在./templates中添加render.html

<!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))

系统内建视图

#urls.py修改

url(r"get404/", gv.do_get404),
#views.py修改

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值