通过django开发一个简单后台管理系统,主要运用django、前端相关知识。本文主要记录一步一步实现过程
创建project django-admin startproject user_manager 创建APP python manage.py startapp app01
主要有班级表、老师表、学生表、用户表。班级和学生是一对多的关系、班级和老师是多对多的关系。
from django.db import models # Create your models here. class Classes(models.Model): caption = models.CharField(max_length=32) class Student(models.Model): name = models.CharField(max_length=32) cls = models.ForeignKey(Classes,on_delete=models.CASCADE) class Teacher(models.Model): name = models.CharField(max_length=32) cls = models.ManyToManyField(Classes) class Administrator(models.Model): username = models.CharField(max_length=32) password = models.CharField(max_length=32)
生成同步数据库的脚本
python manage.py makemigrations
同步数据库
python manage.py migrate
1、登录注册
用户访问登录url,返回登录页面,输入用户名/密码,验证通过,返回首页;验证失败,提示错误信息。用户未登录直接访问首页url,重定向到登录页面(其中会用到cookie和session相关知识)
url设计
from django.contrib import admin from django.urls import path from django.conf.urls import include, url from app01.views import * urlpatterns = [ path(‘admin/‘, admin.site.urls), url(r‘^login/‘, login), #登录url url(r‘^index/‘, index), #首页url ]
登录页面/首页页面/视图函数
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="login.html" method="post"> {% csrf_token %} <div> <label for="user"> 用户名:</label> <input id="user" type="text" name="user"> </div> <div> <label for="pwd"> 密 码:</label> <input id="pwd" type="password" name="pwd"> </div> <div> <label></label> <input type="submit" value="登录"> <span style="color: red">{{ msg }}</span> </div> </form> </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <p>hell {{ user }}</p> </body> </html>
from django.shortcuts import render # Create your views here. from django.shortcuts import redirect from django.http import HttpResponse from django.views.decorators import csrf import json import requests import re import os from app01.models import * #from django.contrib.sessions.backends.db import SessionStore def login(request): message = ‘‘ print(request.COOKIES) """{‘_ga‘: ‘GA1.1.664909549.1531444385‘, ‘csrftoken‘: ‘cH0jMqG7OmrbRcSoOD6FdNTgGdVdFOvRl6x3gH74GnkTFLdxyNAifvoVDiGkinWi‘, ‘sessionid‘: ‘wd7pa91lltnnxe7qjet6uxe3tuyb32jz‘, ‘username‘: ‘root‘}""" #v = request.session #request.session.clear() if request.method == "POST": print(request.POST) user = request.POST.get(‘user‘) pwd = request.POST.get(‘pwd‘) ‘‘‘if user == ‘root‘ and pwd == ‘123‘: rep = redirect(‘/index‘) # 将username写入浏览器cookie,失效时间为60s rep.set_cookie(‘username‘,user,60) return rep‘‘‘ #从数据库中查询用户和密码是否正确 num=Administrator.objects.filter(username=user,password=pwd).count() if num: rep = redirect(‘/index‘) rep.set_cookie(‘username‘, user, 60) #request.session[‘is_login‘] = True #request.session[‘username‘] = user return rep else: message = ‘用户或密码错误‘ return render(request, ‘login.html‘,{‘msg‘:message}) def index(request): #如果用户已经登录获取用户,否则返回登录页面,禁止用户直接访问index页面 # 通过cookie判断用户是否已登录,提取浏览器中的cookie,如果不为空,表示已经登录 user = request.COOKIES.get(‘username‘) #user = request.session.get(‘username‘) if user: return render(request,‘index.html‘,{‘user‘:user}) else: return redirect(‘/login‘)
cookie和session学
1、cookie是什么? -是存储在客户端浏览器上的键值对,作用是记录状态 -原理:是服务器产生,发给客户端浏览器,浏览器保存起来,下次发请求,会携带这个键值对到服务器 -Cookie的覆盖:先写了一个键值对,后来再写,会把原来的值覆盖掉 2、cookie的使用 -设置cookie:在HttpResponse这个对象上写(render, redirect,JsonResponse继承了HttpResponse,均可以设置cookie) -obj.set_cookie(key,value) -取cookie:从request对象中取,取出来是个字典request.COOKIES request.COOKIES.get(‘name‘) -删除cookie: obj.delete_cookie(‘name‘) 3、cookie的其他属性 加密盐 obj.set_cookie(key,value) obj.set_signed_cookie(key,value,salt=‘加密盐‘) •max_age=5, 超时时间,5秒后失效, cookie需要延续的时间(以秒为单位)如果参数是‘None’,这个cookie会延续到浏览器关闭为止 •expires,超时时间,传一个datatime对象 •path=‘/‘, 可以设置路径,设置路径之后,-obj.set_cookie(key,value,path=‘/index/‘),只有访问index的时候,才会携带cookie过来,设置根路径表示所有请求都会携带 •domain=None, Cookie生效的域名 你可用这个参数来构造一个跨站cookie。如, domain=".example.com"所构造的cookie对下面这些站点都是可读的:www.example.com 、 www2.example.com 和an.other.sub.domain.example.com 。如果该参数设置为 None ,cookie只能由设置它的站点读取 •secure=False, 默认是false,设置成True浏览器将通过HTTPS来回传cookie •httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)
Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是Session 1、session: - 存在服务器上的键值对,key是一个随机的字符串,value是一个字典,比如:{‘sdaf随机字符串‘:{name:lww,pwd:123}} -解决cookie不安全的问题,客户端浏览器上不再存储敏感的信息 -如果设置多个,它会以字典的形式存储到session表中的session_data中 -生成session时:request.session[‘name‘]=‘lww‘ 原理: 1 生成随机字符串,如:koerjkdfssl 2 存到数据库,随机字符串是一个字段,{‘name‘:‘lww‘}是一个字段 3 写入cookie(set_cookie(‘sessionid‘,‘koerjkdfssl‘)) -取值 - name=request.session[‘name‘] -执行流程: -取到cookie的随机字符串 -去session表中根据随机字符串查询,查询出session_data这个字典,然后重字典中取出name对应的值 -删除值 -# 取出cookie,随机字符串,去数据库删除随机字符串是当前值的记录 request.session.delete() -#既删除cookie,又删除数据库 request.session.flush()
Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:数据库(默认)、缓存、文件、缓存+数据库、加密cookie
Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。 a. 配置 settings.py SESSION_ENGINE = ‘django.contrib.sessions.backends.db‘ # 引擎(默认) SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认) SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认) SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认) SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认) SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认) SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认) b. 使用 # 获取、设置、删除Session中数据 request.session[‘k1‘] request.session.get(‘k1‘,None) request.session[‘k1‘] = 123 request.session.setdefault(‘k1‘,123) # 存在则不设置 del request.session[‘k1‘] # 所有 键、值、键值对 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems()
原文:https://www.cnblogs.com/quanloveshui/p/11685272.html