Django中视图总结[urls匹配,HttpRequest对象,HttpResponse对象,对象序列化接受及案例]

视图的功能:

接收请求,进行处理,返回应答。

图解

图解剖析

视图返回的内容为:

  • HttpResponse的对象或子对象
  • render 返回的是HttpResponse的对象
  • JsonResponse是HttpResponse的子类
  • HttpResponseRedirect也是HttpResonse的子类
  • redirect是HttpResponseRedirect的一个简写

总结所以视图返回的内容一般为:render,redirect,JsonResponse,Httpresponse

定义视图函数分为两步

一:定义视图

视图函数定义在view.py中

def index(request):
	pass
	return HttpResponse("hello python") 

注:参数中必须设置一个参数:request(request为HttpRequest的对象)需要返回一个HttpResponse的对象返回给浏览器显示的内容

参数还可能有:

  • 通过正则表达式组获得的关键字参数。
  • 通过正则表达式组获取的位置参数。

二:配置url

配置url的过程:

  • 在项目的urls文件中包含具体应用的urls文件,在具体应用的urls文件中包含具体url和视图的对应关系。
  • url配置项是定义在一个名叫urlpatterns的列表中,其中的每一个元素就是一个配置项,每一个配置项都调用url函数。

url函数的两种语法

  • url('正则表达式', include('应用的urls文件'))
  • url('正则表达式',视图函数名)。

开发时的方法:

  • 1.在项目的url文件中配置
urlpatterns = [
    url(r'', include("app名称.urls"))
]
  • 2.在app里面创建一个urls.py文件进行匹配
urlpatterns = [
    url(r'^index$=$', 对应的匹配函数),
    # 这里一般做完全匹配
]

url的匹配过程

url:http://127.0.0.1:8000/aindex/?a=3

# 项目中的urls.py
url(r'^a', include('booktest.urls')),
# 应用中的urls.py配置
url(r'^index/$', views.index),
  1. 去除域名和后面的参数,剩下/aindex/,再把前面的/去掉,剩下aindex/
  2. 拿index/先到项目的url.py文件中进行从上到下的匹配,匹配成功之后执行后面对应的处理动作,就是把匹配成功的部分a字符去除,然后拿剩下的部分index到应用的urls.py文件中再进行从上到下的匹配。
  3. 如果匹配成功则调用相应的视图产生内容返回给客户端。如果匹配失败则产生404错误。

错误提示:

  • 404:找不到页面,关闭调试模式之后,默认会显示一个标准的错误页面,如果要显示自定的页面,则需要的templates目录下面自定义一个404.html文件。
  • 500: 服务器端的错误。
  • 400:非法的客户端请求错误。

如果想看到错误视图而不是调试信息,需要修改test3/setting.py文件的DEBUG项。

DEBUG = False # debug关闭
ALLOWED_HOSTS = ['*', ] #表示允许所有的地址访问 

捕获url参数:

进行url匹配时,把所需要的捕获的部分设置成一个正则表达式组,这样django框架就会自动把匹配成功后相应组的内容作为参数传递给视图函数。
1)位置参数
  位置参数,参数名可以随意指定

url(r'^delete_(d)/$', views.show_add_cookie),

2)关键字参数:在位置参数的基础上给正则表达式组命名即可。
  ?P<组名>
  注:关键字参数,视图参数名必须和正则表达式组名一致.

url(r'^(delete(?P<bid>d+))/$', views.show_arg),

注意:两种参数的方式不要混合使用,在一个正则表达式中只能使用一种参数方式。

HttpRequest对象

服务器收到http协议请求后会根据请求信息创建HttpRequest对象,这个对象不需要我们创建,视图的第一个参数必须是HttpRequest的对象

属性:

  • path:一个字符串,表示请求的页面的完整路径,不包含域名。
  • method:一个字符串,表示请求使用的HTTP方法,常用值包括:'GET'、'POST'。
    • 在浏览器中给出地址发出请求采用get方式,如超链接。
    • 在浏览器中点击表单的提交按钮发起请求,如果表单的method设置为post则为post请求。
  • encoding:一个字符串,表示提交的数据的编码方式。
    • 如果为None则表示使用浏览器的默认设置,一般为utf-8。
    • 这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。
  • GET:一个类似于字典的对象,包含get请求方式的所有参数。
  • POST:一个类似于字典的对象,包含post请求方式的所有参数。
  • FILES:一个类似于字典的对象,包含所有的上传文件。
  • COOKIES:一个标准的Python字典,包含所有的cookie,键和值都为字符串。
  • session:一个既可读又可写的类似于字典的对象,表示当前的会话,只有当Django 启用会话的支持时才可用,详细内容见"状态保持"。

GET属性:

请求格式:在请求地址结尾使用?,之后以“键=值”的格式拼接,多个键值对之间以&连接。
例:网址如下

http://www.itcast.cn/?a=10&b=20&c=python

其中的请求参数为:

a=10&b=20&c=python

总结:

  • 分析请求参数,键为'a'、'b'、'c',值为'10'、'20'、'python'。
  • 在Django中可以使用HttpRequest对象的GET属性获得get方方式请求的参数。
  • GET属性返回QueryDict类型的对象,键和值都是字符串类型。
  • 键是开发人员在编写代码时确定下来的。
  • 值是根据数据生成的。

PSOT属性:

使用form表单请求时,method方式为post则会发起post方式的请求,需要使用HttpRequest对象的POST属性接收参数,POST属性返回QueryDict类型的对象。
提交参数的方式

  • 控件name属性的值作为键,value属性的值为值,构成键值对提交。

总结:

  • 如果控件没有name属性则不提交。
  • 对于checkbox控件,name属性的值相同为一组,被选中的项会被提交,出现一键多值的情况。
  • 键是控件name属性的值,是由开发人员编写的。
  • 值是用户填写或选择的。
  • post提交的值在浏览器的请求体当中可以看到

QueryDict对象:

HttpRequest对象的属性GET、POST都是QueryDict类型的对象与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况
方法get()

根据键获取值如果一个键同时拥有多个值将获取最后一个值

如果键不存在则返回None值,可以设置默认值进行后续处理
示例:

dict.get('键',默认值)

可简写为

dict['键']

方法getlist():

根据键获取值,值以列表返回,可以获取指定键的所有值
如果键不存在则返回空列表[],可以设置默认值进行后续处理
示例:

dict.getlist('键',默认值)

HttpResPonse对象

属性

  • content:表示返回的内容。
  • charset:表示response采用的编码字符集,默认为utf-8。
  • status_code:返回的HTTP响应状态码。
  • content-type:指定返回数据的的MIME类型,默认为'text/html'。

方法

  • init:创建HttpResponse对象后完成返回内容的初始化。
  • set_cookie:设置Cookie信息。
  • write:向响应体中写数据。
  • cookie是网站以键值对格式存储在浏览器中的一段纯文本信息,用于实现用户跟踪。
    • max_age是一个整数,表示在指定秒数后过期。
    • expires是一个datetime或timedelta对象,会话将在这个指定的日期/时间过期。
    • max_age与expires二选一。
    • 如果不指定过期时间,在关闭浏览器时cookie会过期。
set_cookie(key, value='', max_age=None, expires=None)
  • delete_cookie(key):删除指定的key的Cookie,如果key不存在则什么也不发生。

子类JsonResponse

在浏览器中使用javascript发起ajax请求时,返回json格式的数据,类JsonResponse继承自HttpResponse对象,被定义在django.http模块中,创建对象时接收字典作为参数。
JsonResponse对象的content-type为'application/json'。

示例

def get_data_by_ajax(request):
    """等待两秒发送请求"""
    time.sleep(2)
    return JsonResponse({"res": 1})

子类HttpResponseRedirect

当一个逻辑处理完成后,不需要向客户端呈现数据,而是转回到其它页面,如添加成功、修改成功、删除成功后显示数据列表,而数据的列表视图已经开发完成,此时不需要重新编写列表的代码,而是转到这个视图就可以,此时就需要模拟一个用户请求的效果,从一个视图转到另外一个视图,就称为重定向。

  • Django中提供了HttpResponseRedirect对象实现重定向功能,这个类继承自HttpResponse,被定义在django.http模块中,
  • 返回的状态码为302。
  • 重定向简写函数redirect
  • 页面重定向:服务器不返回页面,而是告诉浏览器再去请求其他的url。

示例

def demo_redirect(request):
    """页面重定向"""
    return redirect('/index/')

查询集对象序列化

返回Json数据时需要将查询集进行序列化的操作
导入:

from django.core import serializers

使用serializers里面的方法
# 对查询集进行序列化

books = serializers.serialize('json', books) # "参数一 序列化的类型 参数二序列化的参数

# 将得到的值返回

JsonResponse({'books': books})

# 传到模板文件当中是一个字符串 转成json对象

books = $.parseJSON(data.books)
# books为一个数组每个数组的每个元素为一个json对象
对象序列化的案例
def get_book(request):
    """获取图书信息的视图"""
    books = BookInfo.objects.all()
    # 对查询集进行序列化
    books = serializers.serialize('json', books)
    return JsonResponse({"books": books})
视图Code
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="/static/js/jquery-1.12.4.min.js"></script>
    <script>
        $(function () {
            $.get('/get_book1/',function (data) {
                //将字符串转成json对象
                books = $.parseJSON(data.books)

                content = ''
                //遍历其中的个对象获取属性值
                content += '<tr>'

                $.each(books[0].fields, function (key, val) {
                    content += '<td>'+key+'</td>'

                })
                content += '</tr>'
                //便利打印出每个每个对象
                $.each(books, function (index, data) {
                    content += '<tr>'
                    //遍历打印每个里面的对象fields的值
                    $.each(data.fields, function (key, val) {
                        content += '<td>'+val+'</td>'
                    })
                    content += '</tr>'

                })
                $('#tab').append(content)
            })


        })


    </script>
</head>
<body>
<table id="tab"></table>
</body>
</html>
模板code
原文地址:https://www.cnblogs.com/kayb/p/7255987.html