View视图

视图函数或视图简而言之就是一个Python函数,它接受一个Web请求并返回一个Web响应

此响应可以是网页的HTML内容,重定向或404错误,XML文档或图像。

  • 返回错误

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from django.http import HttpResponse,Http404,HttpResponseNotFound
    def viewsdemo(request):
    # 直接返回一个404,没有去加载404的模板页面
    # return HttpResponseNotFound('<h1>Page not found</h1>')

    # 可以直接返回一个status状态码
    # return HttpResponse(status=403)

    # 返回一个404的错误页面
    raise Http404("Poll does not exist")
  • 关于重定向

    1
    2
    3
    4
    5
    6
    7
    from django.shortcuts import redirect,render
    from django.urls import reverse
    def viewsdemo(request):
    # 重定向 redirect 参数 重定向的url地址
    # return redirect(reverse('ontoone'))
    context = {'msg':'恭喜注册成功,即将跳转到登录页','u':reverse('ontoone')}
    return render(request,'info.html',context)
  • HttpReqeust对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def viewsdemo(request):
    # 请求对象 request ==> HttpRequest
    # 获取当前的请求地址 path路径
    print(request.path)
    # 获取请求方式
    print(request.method)

    # GET是请求对象的一个属性,但是GET本身也是一个类字典的对象
    print(request.GET)
    # 获取GET中参数,POST和GET一样
    #print(request.GET.get('a','1'))
    #print(request.GET['a'])

    return HttpResponse('视图的操作')
  • 请求地址中的一键多值

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    def form(request):
    # 判断请求的方式
    if request.method == 'GET':
    # 加载一个表单模板
    return render(request,'form.html')
    else:
    # 接收表单数据
    data = request.POST
    # print(data)
    # 出现一键一值的情况使用get方法来获取,多值不能使用
    # print(request.POST.get('hobby'))
    print(request.POST.getlist('hobby'))
    print(request.GET.getlist('a'))
    return HttpResponse('接收表单数据')

    form.html的代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <form action="" method="POST">
    {% csrf_token %}
    用户名: <input type="text" name="username"><br>
    密码: <input type="password" name="password"><br>
    邮箱: <input type="text" name="email"><br>
    年龄: <input type="text" name="age"><br>
    性别: <label><input type="radio" name="sex" value="0"></label>
    <label><input type="radio" name="sex" value="1"></label><br>
    爱好: <label><input type="checkbox" name="hobby" value="0">抽烟</label>
    <label><input type="checkbox" name="hobby" value="1">喝酒</label>
    <label><input type="checkbox" name="hobby" value="2">烫头</label>
    <br>
    <button>提交</button>
    </form>
  • JsonResponse

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    from django.http import HttpResponse,JsonResponse
    def index(request):
    import json

    # 响应 模板文件
    # return HttpResponse('hello world')
    data = {'name':'zahngsan','age':20,'sex':'男'}
    # data = [
    # {'name':'zahngsan','age':20,'sex':'男'},
    # {'name':'王五','age':22,'sex':'男'},
    # ]

    # 使用python的json 转为json格式再返回
    # content-type: html
    # return HttpResponse(json.dumps(data))

    # 返回json数据 content-type: json
    return JsonResponse(data,safe=False)

cookie和session

http请求是无状态的请求,请求中并不清楚你上一次请求的情况。

在很多情况下需要记住用户的一些状态,这个时候就需要使用会话跟踪技术,会话控制。

cookie是在浏览器中进行数据的保存,并且在每次请求时会携带保存的数据去访问服务器。

session是把数据存在的服务器端(文件,数据库,内存)并且生成一个sessionid记录到cookie中。

设置cookie

1
2
3
4
5
6
7
8
9
10
11
12
13
def cookie_set(request):
from datetime import datetime
# 1,先获取响应对象
res = HttpResponse('设置cookie')

# 2,使用响应对象设置cookie
# res.set_cookie('name','yichuan')
# res.set_cookie('name','yichuan',3600*24*365)
# res.set_cookie('aa','aabbcc',expires=datetime(2025, 4, 19, 12, 20), path='/')
# key,value ='',max_age = None,expires = None

# 3,返回响应对象
return res

获取cookie

1
2
3
4
5
6
def cookie_get(request):
# 在请求对象中获取cookie信息
data = request.COOKIES.get('name')
print(data)

return HttpResponse('获取cookie')

Django中session需要依赖数据库,因此需要确认数据库中是否存在与session相关的表。

设置session

1
2
3
4
5
6
7
def session_set(request):
# 设置session
request.session['VipUser'] = {'name':'zhangsan','age':20,'id':101}
request.session['username'] = '张三'
request.session['age'] = 10

return HttpResponse('session_set:设置')

获取session

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def session_get(request):
# 获取session
data1 = request.session.get('VipUser')
data2 = request.session.get('username')
data3 = request.session.get('age')

print(data1)
print(data2)
print(data3)

# 删除指定key
del request.session['username']

# 清除会话的内容
request.session.clear()

# 删除会话,把当前会话相关的数据全部删除
# request.session.flush()
return HttpResponse('session_get:获取')