后端>>Django的视图V

本文介绍了Django创建项目的基本流程,重点讲解了视图的使用,包括视图函数的定义、URL配置的语法和过程、URL匹配规则、捕获URL参数以及错误视图的处理。此外,还讨论了HttpRequest对象的属性、QueryDict对象、HttpResponse对象及其子类的使用,以及状态保持中的Cookie和Session机制。最后,通过实例展示了如何在视图中处理Ajax请求和实现重定向功能。
摘要由CSDN通过智能技术生成

创建项目流程

  1. 创建项目django-admin startproject test3
  2. 进入项目目录,创建应用python manage.py startapp booktest
  3. 在test3/settings.py中INSTALLED_APPS项安装应用
  4. 在test3/settings.py中DATABASES项配置使用MySQL数据库
  5. 在test3/settings.py中TEMPLATES项中DIRS中配置模板查找路径
    ‘DIRS’: [os.path.join(BASE_DIR, ‘templates’)]
  6. 创建模板目录
  7. 打开test3/urls.py文件,包含booktest的url配置。
  8. 在booktest/目录下创建urls.py,配置url。

视图

  • 接收请求,进行处理,与M和T进行交互,返回应答。
  • 返回html内容 HttpResponse,也可能重定向 redirect,还可以返回json数据。

使用视图

视图就是一个python函数,被定义在"应用/views.py"文件中。 使用视图时需要进行两方面操作,两个操作不分先后。

  1. 在"应用/views.py"中定义视图
    request参数必须有。是一个HttpRequest类型的对象。参数名可以变化,
    但不要更改。

  2. 配置URLconf,将视图函数和url对应起来。
    建立url和视图函数之间的对应关系。

url配置的过程

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

    这种语法用于test3/urls.py中,目的是将应用的urls配置到应用内部,数据更清晰并且易于维护。
    url(正则,include(‘应用.urls’))

  2. 定义,指定URL和视图函数的对应关系。

    在应用内部创建urls.py文件,指定请求地址与视图的对应关系。
    url(正则,‘视图函数名称’)

url匹配的过程

在这里插入图片描述
url:http://127.0.0.1:8000/aindex?a=1

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

捕获url参数

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

  • 位置参数
    位置参数,参数名可以随意指定
    直接使用小括号,通过位置参数传递给视图。

    1. 为了提取参数,修改上面的正则表达式如下
      url(r’^delete(\d+)/$’,views.show_arg)

    2. 修改视图show_arg如下:
      注意:参数的名字是任意的如a1、b8,尽量做到见名知意。
      def show_arg(request,id):
      return HttpResponse(’ %s’%id)

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

    1. 修改正则表达式如下:
      其中?P部分表示为这个参数定义的名称为id,可以是其它名称,起名做到见名知意。
      url(r’^delete(?P< id1>\d+)/$’,views.show_arg),
    2. 修改视图show_arg如下:
      注意:视图show_arg此时必须要有一个参数名为id1,否则报错。
      def show_arg(request,id1):
      return HttpResponse(‘show %s’%id1)

错误视图

  • 404错误:page not found视图
  • 500错误:server error视图
  • 将请求地址进行url匹配后,没有找到匹配的正则表达式,则调用404/500视图,这个视图会调用404/500.html的模板进行渲染。视图传递变量request_path给模板,表示导致错误的URL。

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

DEBUG = False
ALLOWED_HOSTS = [’*’, ]

自定义错误视图

如果要显示自定义的页面,则需要的templates目录下面自定义一个404.html文件。 主要是这个{{request_path}}

  1. 在templates中创建404/500.html。
  2. 定义代码如下:
    <html>
    <head>
        <title></title>
    </head>
    <body>
    找不到了
    <hr/>
    {{request_path}}
    </body>
    </html>
    

HttpReqeust对象

属性
  • path:一个字符串,表示请求的页面的完整路径,不包含域名和参数部分。

  • method:一个字符串,表示请求使用的HTTP方法,常用值包括:‘GET’、‘POST’。

    • 在浏览器中给出地址发出请求采用get方式,如超链接。
    • 在浏览器中点击表单的提交按钮发起请求,如果表单的method设置为post则为post请求。
  • encoding:一个字符串,表示提交的数据的编码方式。

    • 如果为None则表示使用浏览器的默认设置,一般为utf-8。
    • 这个属性是可写的,可以通过修改它来修改访问表单数据使用的编码,接下来对属性的任何访问将使用新的encoding值。
  • GET:QueryDict类型对象,类似于字典,包含get请求方式的所有参数。

  • POST:QueryDict类型对象,类似于字典,包含post请求方式的所有参数。

  • FILES:一个类似于字典的对象,包含所有的上传文件。

  • COOKIES:一个标准的Python字典,包含所有的cookie,键和值都为字符串。

  • session:一个既可读又可写的类似于字典的对象,表示当前的会话,只有当Django 启用会话的支持时才可用,详细内容见"状态保持"。

QueryDict对象
  • 定义在django.http.QueryDict
  • HttpRequest对象的属性GET、POST都是QueryDict类型的对象
  • 与python字典不同,QueryDict类型的对象用来处理同一个键带有多个值的情况
  • 方法get():根据键获取值
  • 如果一个键同时拥有多个值将获取最后一个值
  • 如果键不存在则返回None值,可以设置默认值进行后续处理

    dict.get(‘键’,默认值)
    可简写为
    dict[‘键’]

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

    dict.getlist(‘键’,默认值)

GET属性

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

  • 在Django中可以使用HttpRequest对象的GET属性获得get方方式请求的参数。
  • GET属性是一个QueryDict类型的对象,键和值都是字符串类型。
  • 键是开发人员在编写代码时确定下来的。
  • 值是根据数据生成的。
POST属性

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

  • 表单控件name属性的值作为键,value属性的值为值,构成键值对提交。
    • 如果表单控件没有name属性则不提交。
    • 对于checkbox控件,name属性的值相同为一组,被选中的项会被提交,出现一键多值的情况。
    • 键是表单控件name属性的值,是由开发人员编写的。
    • 值是用户填写或选择的。

HttpResponse对象

视图在接收请求并处理后,必须返回HttpResponse对象或子对象。在django.http模块中定义了HttpResponse对象的API。HttpRequest对象由Django创建,HttpResponse对象由开发人员创建。

属性
  • content:表示返回的内容。
  • charset:表示response采用的编码字符集,默认为utf-8。
  • status_code:返回的HTTP响应状态码。
  • content-type:指定返回数据的的MIME类型,默认为’text/html’。
方法
  • _ init_:创建HttpResponse对象后完成返回内容的初始化。
  • set_cookie:设置Cookie信息。
  • set_cookie(key, value=’’, max_age=None, expires=None)
  • cookie是网站以键值对格式存储在浏览器中的一段纯文本信息,用于实现用户跟踪。
    • max_age是一个整数,表示在指定秒数后过期。
    • expires是一个datetime或timedelta对象,会话将在这个指定的日期/时间过期。
    • max_age与expires二选一。
    • 如果不指定过期时间,在关闭浏览器时cookie会过期。
  • delete_cookie(key):删除指定的key的Cookie,如果key不存在则什么也不发生。
  • write:向响应体中写数据。
直接返回数据
  1. 打开booktest/views.py文件,定义视图index2如下:
    def index2(request):
    str='<h1>hello world</h1>'
    return HttpResponse(str)
    

2.打开booktest/urls.py文件,配置urlurl(r'^index2/$',views.index2),

调用模板

可以将html、css、js定义到一个html文件中,然后由视图来调用。

  1. 打开booktest/views.py文件,定义视图index3如下:
from django.template import RequestContext, loader
...
def index3(request):
    #加载模板
    t1=loader.get_template('booktest/index3.html')
    #构造上下文
    context=RequestContext(request,{'h1':'hello'})
    #使用上下文渲染模板,生成字符串后返回响应对象
    return HttpResponse(t1.render(context))
  1. 打开booktest/urls.py文件,配置url。
    url(r'^index3/$',views.index3),

  2. 在templates/booktest/目录下创建index3.html,代码如下:

<html>
<head>
    <title>使用模板</title>
</head>
<body>
<h1>{{h1}}</h1>
</body>
</html>
调用模板简写函数render

每次调用模板时都要执行加载、上下文、渲染三个步骤,为了简化操作,Django定义了render()函数封装了以上三个步骤的代码,定义在django.shortcuts模块中。

打开booktest/views.py文件,定义视图index3如下:

from django.shortcuts import render
...
def index3(request):
    return render(request, 'booktest/index3.html', {'h1': 'hello'})

子类JsonResponse

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

例子

1)在booktest/views.py文件中定义视图json1、json2,代码如下:

from django.http import JsonResponse
...
def json1(request):
    return render(request,'booktest/json1.html')
def json2(request):
    return JsonResponse({'h1':'hello','h2':'world'})

2)在booktest/urls.py文件中配置url。

    url(r'^json1/$', views.json1),
    url(r'^json2/$', views.json2),

3)创建目录static/js/,把jquery文件拷贝到js目录下。

4)打开test3/settings.py文件,在文件最底部,配置静态文件查找路径,并且要求开启调试

DEBUG = True
...
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

5)在templates/booktest/目录下创建json1.html,代码如下:

<html>
<head>
    <title>json</title>
    <script src="/static/js/jquery-1.12.4.min.js"></script>
    <script>
        $(function () {
            $('#btnJson').click(function () {
                $.get('/json2/',function (data) {
                    ul=$('#jsonList');
                    ul.append('<li>'+data['h1']+'</li>')
                    ul.append('<li>'+data['h2']+'</li>')
                })
            });
        });
    </script>
</head>
<body>
<input type="button" id="btnJson" value="获取json数据">
<ul id="jsonList"></ul>
</body>
</html>
ajax代码执行过程
  1. 发起请求。
  2. 服务器端视图函数执行。
  3. 执行回调函数。

Ajax登录案例

  1. 首先分析出请求地址时需要携带的参数。
  2. 视图函数处理完成之后,所返回的json的格式。
  • 显示出登录页面
    1. 设计url,通过浏览器访问 http://127.0.0.1:8000/login_ajax 时显示登录页面。
    2. 设计url对应的视图函数login_ajax。
    3. 编写模板文件login_ajax.html。
      在里面写jquery代码发起ajax请求。
  • 登录校验功能
    1. 设计url,点击登录页的登录按钮发起请求http://127.0.0.1:8000/login_ajax_check时进行登录校验。
    2. 设计url对应的视图函数login_ajax_check。
      接收post提交过来的数据。
      进行登录校验,并返回json内容。 JsonRepsone
  • Json格式如下:
    {‘res’:‘1’} #表示登录成功
    {‘res’:‘0’} #表示登录失败

子类HttpResponseRedirect

Django中提供了HttpResponseRedirect对象实现重定向功能,这个类继承自HttpResponse,被定义在django.http模块中,返回的状态码为302。

例子:

1)在booktest/views.py文件中定义视图red1,代码如下:

	from django.http import HttpResponseRedirect
	...
	# 定义重定义向视图,转向首页
	def red1(request):
	    return HttpResponseRedirect('/')

2)在booktest/urls.py文件中配置url。

    url(r'^red1/$', views.red1),
重定向简写函数redirect
  • 在django.shortcuts模块中为重定向类提供了简写函数redirect。

修改booktest/views.py文件中red1视图,代码如下:

	from django.shortcuts import redirect
	...
	def red1(request):
	    return redirect('/')

状态保持

有时需要保存下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等。 实现状态保持主要有两种方式:

  • 在客户端存储信息使用Cookie。
  • 在服务器端存储信息使用Session。

Cookie

Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用。
在这里插入图片描述

  • Cookie的特点
    • 以键值对方式进行存储。
    • 通过浏览器访问一个网站时,会将浏览器存储的跟网站相关的所有cookie信息发送给该网站的服务器。request.COOKIES
    • cookie是基于域名安全的。www.baidu.com www.tudou.com
    • cookie是有过期时间的,如果不指定,默认关闭浏览器之后cookie就会过期。

Session

在这里插入图片描述

  • session的特点:
    • session是以键值对进行存储的。
    • session依赖于cookie。唯一的标识码保存在sessionid cookie中。
    • session也是有过期时间,如果不指定,默认两周就会过期。
对象及方法

通过HttpRequest对象的session属性进行会话的读写操作。

  1. 以键值对的格式写session。
    request.session[‘键’]=值

  2. 根据键读取值。
    request.session.get(‘键’,默认值)

  3. 清除所有session,在存储中删除值部分。
    request.session.clear()

  4. 清除session数据,在存储中删除session的整条数据。
    request.session.flush()

  5. 删除session中的指定键及值,在存储中只删除某个键及对应的值。
    del request.session[‘键’]

  6. 设置会话的超时时间,如果没有指定过期时间则两个星期后过期。
    request.session.set_expiry(value)

  • 如果value是一个整数,会话将在value秒没有活动后过期。
  • 如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期。
  • 如果value为None,那么会话永不过期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值