首页 > 其他 > 详细

Django小项目练习之后台管理系统

时间:2019-10-16 14:51:22      阅读:78      评论:0      收藏:0      [点我收藏+]

    通过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)
models.py
生成同步数据库的脚本
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
]
urls.py

    登录页面/首页页面/视图函数

技术分享图片
<!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>
login.html
技术分享图片
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p>hell {{ user }}</p>
</body>
</html>
index.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)
views.py

     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虽然在一定程度上解决了“保持状态”的需求,但是由于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()
session知识

    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()
数据库Session

 

Django小项目练习之后台管理系统

原文:https://www.cnblogs.com/quanloveshui/p/11685272.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!