Django视图

错误视图

1
2
3
4
5
6
# 配置404页面,当用户请求的页面不存在的时候,就会直接启用该错误视图
# 同理可以配置500的页面,500一般是视图内部出现问题

# 修改项目settings.py文件中的DEBUG:False,
DEBUG = False
ALLOWED_HOSTS = ['*']
1
2
3
4
5
6
7
8
9
10
11
12
# 如果需要自定义404页面,则可以在模板根目录下创建一个404.html文件,django会自动调用
# django在使用404.html文件的时候还会传递一个变量,{{request_path}},记录的是用户请求的页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>页面找不到 {{ request_path }}</h1>
</body>
</html>

url参数传递

1
2
3
4
5
6
7
# 修改的文件是urls.py文件

# 位置参数:通过给url中指定的位置加括号包裹即可,只要包裹了,则视图函数中一定要定义参数接受
path('index/(\d+)', views.index),

# 关键字参数:通过给url中括号包裹的内容添加别名即可,视图函数中的参数则需要与该关键字同名才行
path('index/(?P<num>\d+)', views.index),

request对象信息

  • POST、GET

    视图函数中传递的request参数其实是一个HttpRequest对象,里面包含着用户请求页面的信息

    其中最重要的有两个方法:POST、GET,里面是用户的传递的参数,如下:

    1
    2
    3
    4
    5
    6
    7
    8
    # 假设用户传递用户名【username】
    # 视图通过request对象获取传递的信息
    def login(request):
    # 通过POST方法
    username = request.POST.get('username')
    # 通过get方法
    password = request.GET.get('username')
    return HttpResponse('ok')
  • QueryDict格式

    QueryDict数据对象是django的一种特殊对象,类似于字典,但是比字典要更加的灵活,通过HttpRequest中request获得的各类参数就是QueryDict对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from django.http.request import QueryDict

    # 存入QueryDict参数
    data = QueryDict('q=1&b=2&c=3')

    # 直接读取存入的数据,如果该键对应的数据不存在则报错
    data['a']

    # 通过get方法获取该数据,如果键对应的值不存在则返回null,或者是自己设定的值
    data.get('a')
    data.get('a', 'default')

    # 当传入多个同名的键数据时,get默认只能取最后一个键对应的值,而getlist可以返回键对应的值列表
    data.getlist('a')
  • request常用属性

    属性名 含义
    path 字符串,表示请求的完整路径,不包含域名和参数
    method 字符串,表示请求的方式
    encoding 表示提交请求数据时的编码方式
    GET QueryDict对象,包含请求携带的所有get数据
    POST QueryDict对象,包含请求携带的所有POST数据
    FILES 类似于字典的对象,包含所有上传的文件
    COOKIES 标准的python字典,包含所有的cookie数据,键值对都是字符串
    session 既可读又可写的类似于字典的对象,表示当前的会话

ajax请求

  • django静态文件

    1
    2
    3
    4
    5
    6
    7
    8
    # 在根目录下新建一个【static】文件夹,内部按照不同的静态文件再单独新建文件夹
    # 在项目的settings.py文件夹中配置静态文件的路径

    STATIC_URL = '/static/'
    STATICFILES_DIR = [os.path.join(BASE_DIR, 'static')]

    # 配置完以后在模板文件中引入,则按照相对路径引入即可
    <img href='/static/imgage/1.png'>
  • 配置ajax请求的页面返回数据:一般是json格式的数据

    1
    2
    3
    4
    5
    # 页面返回json数据,则需要调用JsonResponse,它返回给前端页面的是一个json格式的数据
    from django.http import JsonResponse

    def login_check(request):
    return JsonResponse({"name":"shuai"})
  • ajax对应的模板参考

    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
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
    <script type="text/javascript">
    $(function () {
    $('#btn').click(function () {
    $.ajax({
    url:'/login_check',
    datatype: 'json',
    }
    ).success(function (data) {
    alert(data['name'])
    }).fail(function () {
    alert('失败了')
    })
    })
    })

    </script>
    </head>
    <body>
    <input type="button" id="btn" value="按钮">
    </body>
    </html>

http协议是一个无状态的协议,下一次访问页面时是无法知道上一次访问该页面时做了什么

  • cookie本质:由服务器生成,存储在浏览器中的一小段文本信息

  • cookie的特点:

    • 以键值对存在
    • 通过浏览器访问网站时,会将浏览器存储的COOKIE内容全部发送给服务器,服务器访问传递来的cookie数据:【request.COOKIES】
    • cookie是基于域名安全的
    • cookie有过期时间,如果不指定,则关闭浏览器后该cookie就会失效
  • 设置Cookie

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # cookie设置和获取需要在视图函数中设定
    # 设置cookie需要一个HttpResponse对象,或者是其子类对象

    # cookie的设置方式:set_cookie()

    def set_cookie(request):
    response = HttpResponse('设置cookie的值信息')
    # 通过expires设置cookie的过期时间
    response.set_cookie('cookie_name', 'cookie_value', expires=datetime.now() + timedelta(days = 14))
    # 设置max_age来设置cookie的过期时间
    # response.set_cookie('cookie_name', 'cookie_value', max_age=14*24*3600)
    return response
  • 获取cookie

    1
    2
    3
    4
    def get_cookie(request):
    # 获取cookie的方式, cookie中不管设置时是什么数据格式,获取的时候都变成字符串
    cookie_value = request.COOKIES['cookie_name']
    return cookie_value

Session

session存储于服务器端

  • session的特点

    • session以键值对进行存储,django中使用django_session表存储session数据信息,其中有三个子段:session_key【随机主键值】、session_data【存储的数据,base64加密后的】、expiredate【过期时间,默认14天】
    • session依赖于cookie,因为客户端的数据通过cookie进行存储
    • session也有过期时间,如果不指定,默认两周后自动过期
  • session的设置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # session的配置和获取都在视图函数中进行配置
    def set_session(request):

    if request.session.has_key('usename'):
    return redirect('/index')
    # 设置session时通过request
    request.session['usename'] = 'smart'
    request.session['age'] = 18
    return HttpResponse('设置session')
  • session的获取

    1
    2
    3
    4
    5
    def get_session(request):
    username = request.session['usename']
    # session中,存储时是什么格式的数据,取出来的时候就是什么类型的数据
    age = request.session['age']
    return HttpResponse(username + ':' + str(age))
  • session的常用方法

    方法名 含义
    request.session[‘键’]=’值’ 设置session
    request.session.get(‘键’, 默认值) 根据键读取session值,如果没有则返回默认值
    request.session.clear() 清除当前用户存储的所有session值,但是只清除值部分
    request.session.flush() 清除session数据,在存储中删除掉整条session数据
    del request.session[‘键’] 只删除session中对应的键值信息
    request.session.set_expiry(value) 设置会话的超时时间,没有设定则默认两周。value=整数,表示在指定的秒以后过期。value=0,表示session在用户的浏览器关闭时即过期。value=None,表示session在两周后自动过期。
    Request.session.has_key(‘键’) 判断session中是否含有某个键,有则返回True,否则返回False