目录
6、创建表----->makemigrations----->migrate
7、创建用户(邮箱符合规范即可)----->createsuperuser
10、设置查询学生信息必须先登录(重定向的设置)
11、这是为啥呢,抓包分析一下(重定向的原理)
14、接下来用代码访问一下登录接口(温馨提示,提交表单用post),看看响应头
cookie和session
Cookie和session的区别:
1.cookie数据存在客户浏览器上,session数据存放在服务器上。
2.Cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗(使用用户的cookies获取相关信息)。
3.Session会存放在一定时间内保存在服务器上。当访问增多,会比较占用服务器的性能。
4.单个cookie保存的数据不能超过4k, 很多浏览器都限制一个站点最多保存20个cookie。
Cookie和session的利弊:
带上cookie、session的好处:很多网站必须登录之后(或者获取某种权限之后)才能够请求到相关数据。
带上cookie、session的弊端:一套cookie、session往往和一个用户对应。请求太快,请求次数太多,容易被服务器识别为爬虫。从而是账号受到损害使用建议:
1.不需要cookie的时候尽量不需要使用cookie。
2.为获取登录之后的页面,我们必须发送带有cookie的请求,此时为了确保账号安全应该尽量降低数据采集速度。
继续啃django框架
1、定义接口
from django.shortcuts import render
from django.http.response import *
from django.contrib import auth
from django.contrib.auth.decorators import login_required
import json
# Create your views here.
students = [
{'name': 'tom', 'age': 22, 'sex': '男', 'classid': 'T1029'},
{'name': 'mary', 'age': 22, 'sex': '女', 'classid': 'T1028'},
{'name': 'robot', 'age': 25, 'sex': '男', 'classid': 'T1027'},
]
# 测试账号
# admin
# admin123
def login(request):
"""
登录系统
:param request:
:return:
"""
if request.method == 'GET':
# 请求登录页面
return render(request, 'login.html')
elif request.method == 'POST':
# 提交表单
username = request.POST.get('username')
password = request.POST.get('password')
if (not username) or (not password):
return JsonResponse({'result': 1, 'msg': '用户名或密码为空'})
user = auth.authenticate(username=username, password=password)
if user is not None:
auth.login(request, user)
return JsonResponse({'result': 0, 'msg': 'login success'})
return JsonResponse({'result': 2, 'msg': '用户名或密码错误'})
else:
return HttpResponseNotAllowed(['GET', 'POST'])
# 退出登录
def logout(request):
auth.logout(request=request)
return HttpResponseRedirect('/login')
@login_required(login_url='/login')
def html_response_api(request):
print('request.path:', request.path)
print('request.path:', request.path_info)
print('request.path:', request.headers)
print('request.path:', request.body)
name = request.GET.get('name')
data = {'name': name}
return render(request, 'mypage.html', data)
@login_required(login_url='/login')
def add_student_json(request):
"""
添加学生信息
:param request:
:return:
"""
data = request.body.decode(encoding='utf8')
print(data)
try:
json.loads(data)
except:
print('parse json error')
return JsonResponse({'result': 1, 'msg': 'data format error: not json'})
return JsonResponse({'result': 0, 'msg': 'success'})
@login_required(login_url='/login')
def add_student(request):
"""
添加学生信息
:param request:
:return:
"""
if request.method != 'POST':
return HttpResponseNotAllowed(['POST'])
name = request.POST.get('name')
age = request.POST.get('age')
sex = request.POST.get('sex')
classid = request.POST.get('classid')
print('age type is', type(age))
print('age is', age)
student = {}
if not name:
return JsonResponse({'result': 1, 'msg': 'name missing'})
if age is not None and not( age.isdigit() and age[0] != '0'):
return JsonResponse({'result': 2, 'msg': 'age invalid'})
if sex is not None and sex not in ('男', '女'):
return JsonResponse({'result': 3, 'msg': 'sex invalid'})
student.update(name=name, age=int(age) if age is not None else 0,
sex=sex if sex is not None else '男',
classid=classid if classid is not None else 'T0000')
return JsonResponse({'result': 0, 'msg': 'success'})
@login_required(login_url='/login')
def query_student(request):
"""
查询学生信息
:param request:
:return:
"""
# 判断请求方法
if request.method != 'GET':
return HttpResponseNotAllowed(['GET'])
name = request.GET.get('name')
data = []
if name:
for student in students:
if name == student['name']:
data.append(student)
if data:
return JsonResponse({'result':0, 'msg': 'success', 'data': data})
else:
return JsonResponse({'result': 1, 'msg': 'fail', 'data': None})
else:
return JsonResponse({'result': 2, 'msg': 'parameter missing', 'data': None})
2、映射路径
urlpatterns = [
path('gethtml', html_response_api),
path('logout', logout),
path('login', login),
path('api/student/add', add_student_json),
path('student/add', add_student),
path('student/query', query_student),
path('hi', hello),
path('admin/', admin.site.urls),
]
3、创建模板
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta