Django视图V

视图

一.视图的功能

请求接受,进行处理,与M和T进行交互,返回应答。

返回 html 内容 HttpResponse 也可以重定向 redirect

二.视图函数使用

1.使用

  • 定义视图函数 request 参数必须有。是一个 HttpRequest类型对象。参数名可以变换,但不要更改。
  • 配置url建立url 和视图函数之间的对应关系。

2.url配置过程

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

3.url匹配的过程

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

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

4.错误视图

404:找不到页面,关闭浏览器调试模式之后,默认会显示一个标准的错误页面,如果要显示自定义的页面,则需要的templates目录下面自定义一个404.html文件。

  1. url没有配置
  2. url配置错误

500:服务器端的错误。

  1. 视图错误

网站开发完成需要关闭调试模式,在settings.py 文件中:

1
2
DEBUG = False
ALLOWED_HOST=["*"]

5.捕获url参数

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

  1. 位置参数

    • 位置参数,参数名可以随意指定

      1
      2
      3
      urlpatterns = [
      path('index(\d+)',views.index), //捕获url参数:位置参数
      ]
  2. 关键字参数:在位置参数的基础伤给正则表达式组命名即可。

    • ?P<组名>

    • 关键字参数,视图中参数名必须和正则表达式组名一致。

      1
      2
      3
      urlpatterns = [
      path('index(?p<num>\d+)',views.index), //捕获url参数:关键字参数
      ]
  • request就是HttpRequest类型的对象
  • request包含浏览器请求的信息

6.普通登陆案例

  • 显示出登陆页面

    • 设计url,通过浏览器访问 http://127.0.0.1:8000/login 的时候显示登陆页面

    • 设计url对应的视图函数logjn

    • 编写模板文件 login.html

      1
      2
      3
      4
      5
      <form method = 'POST' action = '/login_check'>   //提交方式,提交到那个页面
      用户名:<input type='text' name='username'><br>
      密码:<input type='password' name='password'><br>
      <input type='submit' value='登陆'>
      </form>
- POST:提交的参数请求头。
- GET:提交的参数在url中。

属性:

  • 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 启用绘画的支持时才可使用,详情内容见 “状态保持”。
  • 运行服务器,在浏览器中浏览首页,可以在浏览器“开发者工具”中看到下图:

7.Ajax

(1).基本概念

  1. 点击普通的超链接和手动输入地址。

  2. 表单提交。

  3. 通过ajax请求。

    请求 –> 响应

处理函数

  1. 返回页面 HttpResponse
  2. 重定向 HttpResoonseRedirect
  3. 返回Json数据 JsonResponse

发起请求后不等结束,程序直接进行的被成为异步

异步就是发起请求后,代码继续执行不会等回调函数执行,等到服务器返回j’son之后,这个回调函数才会被执行。

同步ajax请求是按照代码的顺序依次执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$(function(){
//绑定btnAax的click事件
$('#btnAjax').click(function(){
alert(1)
.ajax({
'url':'/ajax_handle',
'dataType':'json',
'async':false, //同步的ajax请求
}).success(function(data){
//进行处理
alter(2)
if (data.res ==1){
$('#messags').show().html(‘提示信息)
}
})
alert(3)
})
})

(2).Ajax登陆案例

首先分析出访问地址时候需要携带的参数。

视图函数处理完成之后,所返回的json的格式。

  1. 显示出登陆页面

    1. 设计url,通过浏览器访问 http://127.0.0.1:8000/login_ajax 时候显示登陆页面。

    2. 设计url对应的视图函数 login_ajax

    3. 编写模板文件 login_ajax.html

      在里面写jquery代码发起ajax请求。

  2. 登陆校验功能

    1. 设计url,点击登陆页的登陆按钮发起请求http://127.0.0.1:8000/login_ajax_check时进行校验。

    2. 设计url对应的视图函数 login_ajax_check

      接受post提交过来的数据。

      进行登陆校验,并返回json内容。JsonResonse

      1
      2
      {'res':'1'}       //表示登陆成功
      {'res':'0'} //表示登陆失败

8.状态保持

Http协议是无访问状态的。下一次去访问同一个页面并不知道上一次对这个页面做了什么。

比如你去卖豆浆,你是浏览器,老板是服务器,你去买豆浆就是一个请求,你请求网站的时候他记不住信息 他记不住你买过豆浆他就给了你一个单子 就是cookie,这个单子交给浏览器 由你来保管下次你再来访问 服务器的时候 你就会把单子给服务器,老板就知道你买过豆浆。

cookie:是有服务器生成,存储在浏览器的一小段文本信息。

#####cooie的特点:

  1. 以键值对方式进行存储。

  2. 通过浏览器访问一个网站时,会将浏览器存储的跟网站相关的所有cookie信息发送给网站的服务器。request.COOKIES

    (你去买烧饼,你去买烧饼,你只会把买少烧饼的单子给他 你肯定不会把卖豆浆的单子也起给他)

  3. cookie 是基于域名安全的。

  4. cookie是有过期时间的,如果不指定,默认关闭浏览器之后 cookie就会过期。

#####注册Cookie

1
2
3
4
5
6
7
def set_cookie(request):
'''设置cookie信息'''
response = HttpResponse('设置一个cookie')
#设置一个cookie信息名字为 'mum'值为1
response.set_cookie('num',1)
#返回response
return response

#####获取Cookie

1
2
3
4
5
6
def get_cookie(request):
'''获取cookie的信息'''
#取出cookie num的值
num = request.COOKIES['num']
# 返回 num
return HttpResponse(num)
设置过期时间
格式 描述
max_age= 设置秒,保存cookie的时候是多少秒过期
expires= 设置时间,到达一定时间后过期

max_age设置cookie两周过期:

1
response.set_cookie('num':1,max_age = 14*24*3600)

expires 设置cookie两周过期

1
2
3
from datetime import datetime,timedelta

response.set_cookie('num':1,expires=datetime.now()+timedelta(days=14))

HttpResponse子类对象:

  • HttpResponseRedirect
  • JsonResponse
记住用户案例

view代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
def login(request):
'''显示登陆页面'''
#获取cookie username
if 'username' in request.COOKIES:
#获取记住的用户名
username = request.COOKIES['username']
else:
username = '' #如果没有返回为空
return render(request,'booktest/login.html',{'username':username})


def login_check(request):
'''登陆校验视图'''
#request.POST 保存post方式提交参数 QueryDict
#request.GET 保存get方式提交的参数
#1.获取提交的用户名和密码
username = request.POST.get('username') #获取用户名
password = request.POST.get('password') #获取密码
remember = request.POST.get('remember') #获取是否保存用户密码
#2.进行登陆的校验
#实际开发:根据用户名和密码查找数据库
#模拟:smart 123
if username =='smart' and password =='123':
#用户名密码正确跳转到首页
response = redirect('/index')
#判断是否需要记住用户名
if remember =='on': #点击事件选中返回为’on‘ 未选中返回’None‘
#设置cookie username 过期时间为一周
response.set_cookie('username':username,max_age=7*24*3600)
return response
else:
#用户名密码错误跳转到首页
return redirect('/')

template/login.html

1
2
3
4
5
6
7
8
9
10
<body>
POST:提交的参数请求头,数据安全性要去比较高的时候用post.
GET:提交参数在url.
<form method = 'post' action='logjin_check'>
用户名:<input type='text' name ='username' value='{{username}}'><br/>
密码:<input type='password' name='pawword'><br/>
<input type='checkbox' name='remember' >记住用户名<br>
<input type='submit' value = '登录'>
</form>
</body>

####(2).Session

session 存储在服务器端。

session的特点:
  1. session是以键值对进行存储的。

  2. session依赖于cookie。唯一的标识码保存在sessionid cookie 中。

    • 问:所有请求者的session 都会存储在服务器中,服务器如何区分请求者和session的数据对应关系呢?

    • 答:在使用session后,会在Cookie中存储一条sessionid的数据,每次请求时浏览器都会将这个数据发给服务器,服务器接收sessionid后,会根据这个值找到这个请求者的session.

    • 结果如果想使用session,浏览器必须支持cookie,否则就无法使用session了。

    • 存储session时,键与Cookie中的sessionid相同,值是开发人员设置的键值对信息进行了base64编码,过期时间有开发人员设置。

  3. session 也是有过期时间的,如果不指定,默认就会两周过期。

对象及方法

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

  1. 以键值对的格式写session.

    1
    request.session['键'] = 值
  2. 根据键获取值。

    1
    request.session.get['键',默认值]
  3. 清除所有session,在存储中删除部分值

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

    1
    request.session.flush()
  5. 删除session中指定键及值,在存储中只删除某个键及对应的值。

    1
    del request.session['键']
  6. 设置会话超时时间,如果没有指定过期时间则两星期后过期。

    1
    request.session.set_expiry(value)
    • 如果value是一个整数,会话的session_id cookie 将在value秒没有活动后过期。
    • 如果value为0,那么用户的session_id cookie 将在用户的浏览器关闭时过期。
    • 如果value为None,那么会话的session_id cookie 两周之后过期。
设置session

设置session : request.session[‘username’]=’root’

1
2
3
4
5
def set_session(request):
'''设置session'''
request.session['username'] = 'root'
request.session['password'] = '123456'
return HttpResponse('设置session')
获取session

获取session:request.session[‘username’]

1
2
3
4
5
def get_session(request):
'''获取session'''
username = request.session['username']
password = request.session['password']
return HttpResponse(username+":"+password) #session保存进去什么字符取出来也是什么字符
清除session
1
2
3
4
5
def clear_session(request):
request.session.clear() //清除部分数据通过 base64解码后看到结果是清除了 字典中的数据
request.session.clush() //清除所有关于session的数据。
del request.session['键'] //session里面存储多个键值对,可以指定删除某一个。
return HttpResponse('清除成功!!')

#####session过期时间

1
2
3
4
5
6
7
def set_session(request):
'''设置session'''
request.session['username'] = 'root'
request.session['password'] = '123456'

request.session.set_expiry(5) // 以秒为单位 设置session过期时间为5
return HttpResponse('设置session')

(3).cookie和session的应用场景

Cookie:

  • 记住用户名。

  • 保存在浏览器端。

  • 对于安全性要求不高的数据可以使用cookie进行保存。

session:

  • 记住用户的登录状态

  • 保存在服务器端

  • 对于安全性要求比较高的,比如用户银行卡等信息使用session进行保存。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 jaytp@qq.com
目录
主站