一、中介模型

四个项目:
苑昊 博客(BBS) (7-8) CRM
1.权限组件 (3)
2.start组件 -- admin (5)
1.使用
2.源码 django 源码 (面向对象)
以源码为导师
使用python最顶头的人写出来的
3.开发类似于源码的组件
4.面向对象。。。优点。。。
3.crm (4) 路飞学城
1.vue (3)
2.rest-framework (4)
3.路飞学诚 爬虫
linux
flask -------------------------------------------------
Book():
title =
publish = models.ForeignKey(to='Publish',to_field='id')
authors = models.manytomany(to='author') Publish():
name=
email= Author():
name= book author
id book_id author_id
1 1 1 class book2author():
id=
book=models.ForeignKey('Book')
author=models.ForeignKey('Author')
xxx=models... book2author
id book_id author_id
1 1 1 book_obj = Book.object.filter(pk=1).first()
book_obj.authors.all()
book_obj.authors.add(1,2)
book_obj.authors.set([1,2]) 刷新在插入
remove 解除
clear 全解除 如果没有 // authors = models.manytomany(to='author')
Book2author.object.create(book_id=1,author_id=2)
意味着 跨表查询没有了 正向查询按字段 反向查询按表名
那如果用字段authors = models.manytomany(to='author'),但是第三张表用自己的!
authors = models.manytomany(to='author',through="Book2Author")...通过through
以后跨表查询就走的是自己建的表,(中介模型)自己建的表(Book2Author叫中介模型)可进行扩展 中介模型:第三张表 可以create 可不可以add? 不可以!!
Book2author.object.create(book_id=1,author_id=2)
book_obj.authors.add(1,2) 这个方法就不能使用了!!否则就会报错 add set remove clear 都不能用了

笔记

中介模型:
只针对 多对多
authors = models.manytomany(to='author')
book_obj.authors.add(1,2)
authors = models.manytomany(to='author',through="Book2Author") # (好处,可扩展)
#(add set remove clear 都不能用了!!)
# 不能使用接口函数!
Book2author.object.create(book_id=1,author_id=2,... )
class Book2Author():
id = ...
book = models.Foreignkey()
author = models.ForeighKey()
xxx = ... # 有可能有多个字段。。扩展

二、简介

博客系统(cnblog) https://www.cnblogs.com/
预备知识:
1.django ORM (object relation mapping 对象关系映射) 表 = 类 对象 = 记录
跨表查询 分组查询 annotate() 聚合查询 aggregate(*args, **kwargs)
2.bootstrap
3.Ajax (jquery javascript) --- javascript 去写ajax 去写写
登录注册 点赞评论
用框架 底层要会!
4.用户认证系统!
auth user session 考虑的太多 会报异常!!所以用auth user 实现功能:
1.基于Ajax和用户认证实现登录验证!
--- 验证码 图片 滑动(插件)
登录 注册 Ajax 2.基于Ajax和form组件实现注册功能! 3.系统首页的布局
https://www.cnblogs.com/ 表关系 第一步:
文章表: 表头 内容,发布时间
用户表: 一对多 4.个人站点页面设计
https://www.cnblogs.com/wupeiqi
https://www.cnblogs.com/linhaifeng 标签 分类 归档(发布日期 group by)
分类表:一对多 和文章表
标签表:多对多 和文章表 5.文章详细页面
模板继承
文章表 content内容非常多,分成两张表,否则会每次都查所有的字段;
Artical
id
title ...
desc ...
create_time ...
ad_id = models.OneToOne() 1 / 5
ArticalDetail:
id
content ...
一对一 6.基于Ajax实现文章点赞与踩灭
描述行为的就是数据;
ArticalUpDown
id
user_id
artical_id
is_up true false
( user_id artical_id 联合唯一 unqiue_together )
ArticalUpDown.object.create() 7.基于Ajax实现评论框
Comment:
id
user_id
artical_id
create_time
content 对文章的评论和对评论的评论
评论树:
111
444
555
666
222
333
评论楼:
直接按时间下来的 user
id name
1 alex
2 egon id user_id artical_id create_time content p_id(记录父评论)
1 1 2 2012 111 None
2 2 2 2012 222 None
3 3 2 2012 333 None
4 4 2 2012 444 1
5 5 2 2012 555 4
6 6 2 2012 666 1 create Comment():
id = ...
user = models.ForeignKey('User')
artical = models.ForeignKey('Artical')
create_time =
content = ...
pid = models.ForeignKey("selef",null=true,default=None) # 表的自关联 8.kindeditor 文本编辑器
防止跨域,安全攻击!发文章 有些<js>恶意攻击
思路:1.转义,对文章过滤,<script></script>
beautitulSoup 模块
表设计:
Artical
id
title
desc
create_time
ad_id = models.OneToOne('ArticalDetail')
type_id = models.ForeignerKey('Type')
tag_id = models.ManyToMany('Tag') ArticalDetail: 一对一
id
content User:
id
username
password Type 分类表: 一对多
id
name Tag 标签表: 多对多
id
name ArticalUpDown 点赞踩灭表: 联合唯一 unique(user_id,artical_id)
id
user_id = models.ForeignKey('User')
artical_id = models.ForeignKey('Artical')
is_up true/false Comment 评论表 注意:对文章的评论和对评论的评论:评论树,评论楼, 表的自关联(null=true)
id
user_id = models.ForeignKey('User')
artical_id = models.ForeignKey('Artical')
create_time
content
p_id = models.ForeignKey('self',null=true,default=None)
#(记录父评论) None / 1 / 4 / ...

表设计

三、cookie session

cookie session

    request.session['key'] = 'value'
request.session.get('key') 必须要知道源码流程,知其然还要知其所以然 用户认证组件(基于session)(auth / User)
session:

1.使用
   def login(request):
if request.method == 'POST':
user = request.POST.get('user')
pwd = request.POST.get('pwd') user = models.UserInfo.objects.filter(name=user,pwd=pwd).first()
if user:
request.session['username'] = user.name
request.session['user_id'] = user.pk
return redirect('/index/')
else:
return render(request,'login.html') return render(request,'login.html') def index(request):
username = request.session.get('username')
if not username:
return redirect('/login/',)
return render(request,'index.html',{'username':username})
2.分析session
django 到了做了什么,其他框架没有session组件!! request.session['username'] = user.name
0.判断session_id是否已经存在,存在就更新,不存在就创建
1.obj.set_cookie('session_id','hn9tyjh56msytq8j4tuyffpezb9vfg09')
2.django-session
session-key session-date expire-date
hn9tyj*** {'username':'alex','user_id':1} 2018-06-14 04:05:28.620101 request.session.get('username'):
1.cookie{'session_id':'hn9tyj***'}
2.在django-session表中:
obj = django-session.object.filter(session-key='hn9tyj***'),first()
obj.session-data.get('username) 疑问:
同一个浏览器多个用户登录:session表里不会多一个数据,除非换了浏览器;
第二次访问,代码发生了什么事情!session表里,一个浏览器一条记录!
每个浏览器都维持一个cookie !为什么这样?源码 第一次浏览器访问,取不出来session_id 就创建,一条记录 create
第二次浏览器访问,能取出来session_id,就更新,不在是创建 update 3.查看源码
from django.contrib.sessions.middleware import SessionMiddleware
def process_request(self, request):pass
def process_response(self, request, response):pass 注意:
1.def process_request(self, request):pass
django 有两个settings
用户级别 比 系统级别的高,可覆盖! from django.contrib.sessions.backends import db
class SessionStore(SessionBase):pass
request.session = self.SessionStore(session_key) 所以:request.session 是一个空对象
能这样赋值使因为:request.session['username'] = 'alex'
def __getitem__(self, key):
return self._session[key] def __setitem__(self, key, value):
self._session[key] = value
self.modified = True 结果:得到一个request.session空对象{}
视图函数里赋值:
request.session['username'] = 'alex' 2.def process_response(self, request, response):pass
request.session.save()
obj.save(force_insert=must_create, force_update=not must_create, using=using)
浏览器的session_id 有,就更新,没有,就创建; 总结:
session源码:
请求:http://127.0.0.1:8080/login post name=alex&pwd=123
第一站:
中间件SessionMiddleWare的process_request def process_request():
request.session = self.SessionStore(session_key)
_session = {}
_session_cache = {} 第二站:views:
def login(request):
user = request.POST.get('user')
pwd = request.POST.get('pwd') user = models.UserInfo.objects.filter(name=user,pwd=pwd).first()
if user:
request.session['username'] = user.name
request.session['user_id'] = user.pk
return redirect('/index/')
else:
return render(request,'login.html') 操作:
执行 self.SessionStore(session_key)类下的__setitem__():
self._session_cache = {'username':'alex','user_id',1} 第三站:中间件 SessionMiddleware的process_response():
存储记录:
if self._session_key:
self._session_key = 'asdas23213123ssasda'
self.save(must_create=True) self.save(must_create=False)
写Cookie
response.set_cookie(
'session_id',
self._session_key,
) 看源码:理解,学习,使用!! 4.django得流程
浏览器 (请求首行 请求头 请求体) wsgi (http协议整理数据 解析数据) 中间件 url views orm
中间件 process_request process_response process_view process_exception process_template_response wsgi 功能:1.解析请求的数据,request 之后随便用
2.响应体 view 返回 字符串,返回浏览器 按响应格式返回,否则浏览器不识别(响应首行,响应头)

四、用户认证组件

python manage.py makemigrations
python manage.py migrate
也可以:
Tools / Run manage.py Task
makemigrations
migrate ------------------------- 用户认证组件: from django.contrib import auth
from django.contrib.auth.models import User auth
针对 auth_user 表
创建超级用户:
python manage.py createsuperuser
root root1234
alex alex1234 1.user = auth.authenticate(username=user, password=pwd)
成功返回用户对象 <class 'django.contrib.auth.models.User'>
失败返回 None 2.auth.login(request,user)
request.session['user_id'] = user.pk
# request.user = user # 不能用这个 否则多个人 就串了!!
request.user = User.objects.filter(pk=user.pk).first() 就可以 调用
request.user 匿名对象 / 该用户对象 3.auth.logout(request)
request.session.flush() 4.from django.contrib.auth.models import User
User.objects.create_user(username=user,password=pwd)
User.objects.create_superuser(username=user,password=pwd,email='123@qq.com')
权限用户 超级用户 所有表的所有权限

示例:
from django.shortcuts import render,HttpResponse,redirect
from django.contrib import auth
from django.contrib.auth.models import User def login(request):
if request.method == 'POST':
user = request.POST.get('user')
pwd = request.POST.get('pwd')
user = auth.authenticate(username = user,password=pwd)
if user:
auth.login(request,user)
return redirect('/index/')
return render(request,'login.html') def index(request):
username = request.user.username
if not request.user.is_authenticated:
# if not username:
return redirect('/login/')
return render(request,'index.html',{'username':username}) def logout(request):
auth.logout(request)
return redirect('/login/') def reg(request):
if request.method == 'POST':
user = request.POST.get('user')
pwd = request.POST.get('pwd')
user = User.objects.create_user(username=user,password=pwd)
auth.login(request,user)
return redirect('/index/')
return render(request,'login.html')

?既想用 auth_user 表,还想扩展,表字段如何做呢?

models.py
from django.db import models
from django.contrib.auth.models import User,AbstractUser # 用类继承
# userinfo 和 auth_user 合成一张表
# 因此可以用登录认证的功能 class UserInfo(AbstractUser):
tel = models.CharField(max_length=32) # settings配置 若没有,报错'UserInfo.groups';
AUTH_USER_MODEL = 'app01.UserInfo' Tools / Run manage.py Task
makemigrations
migrate 新生成得表 app01_userinfo (可以用登录认证的功能)
字段就是 auth_user 和 UserInfo 得合成!!

												

BBS - 预备知识的更多相关文章

  1. 【学习笔记】Linux基础(零):预备知识

    学习笔记(连载)之Linux系列 Note:本学习笔记源自<鸟哥的Linux私房菜(基础学习篇)>一书,为此书重要内容的摘要和总结,对于一些常识性的知识不再归纳 新型冠状病毒引发的肺炎战& ...

  2. 驱动开发学习笔记. 0.06 嵌入式linux视频开发之预备知识

    驱动开发读书笔记. 0.06  嵌入式linux视频开发之预备知识 由于毕业设计选择了嵌入式linux视频开发相关的项目,于是找了相关的资料,下面是一下预备知识 UVC : UVC,全称为:USB v ...

  3. 受限玻尔兹曼机(RBM)学习笔记(一)预备知识

    去年 6 月份写的博文<Yusuke Sugomori 的 C 语言 Deep Learning 程序解读>是囫囵吞枣地读完一个关于 DBN 算法的开源代码后的笔记,当时对其中涉及的算法原 ...

  4. 学习Identity Server 4的预备知识

    我要使用asp.net core 2.0 web api 搭建一个基础框架并立即应用于一个实际的项目中去. 这里需要使用identity server 4 做单点登陆. 下面就简单学习一下相关的预备知 ...

  5. JAVA面向对象-----面向对象(基础预备知识汇总)

    终于整理好了面向对象基础预备知识,但是有点多,所以你们懂的,贴图,较长的代码我还是会排版出来的,我不想把时间浪费在排版上在word里排版一次已经很浪费时间了,所以请谅解. public class C ...

  6. 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 (2) + 准备项目

    上一部分预备知识在这 http://www.cnblogs.com/cgzl/p/9010978.html 如果您对ASP.NET Core很了解的话,可以不看本文, 本文基本都是官方文档的内容. A ...

  7. ASP.NET Core的实时库: SignalR -- 预备知识

    大纲 本系列会分为2-3篇文章. 第一篇介绍SignalR的预备知识和原理 然后会介绍SignalR和如何在ASP.NET Core里使用SignalR. 本文的目录如下: 实时Web简述 Long ...

  8. 学习Identity Server 4的预备知识 (误删, 重补)

    我要使用asp.net core 2.0 web api 搭建一个基础框架并立即应用于一个实际的项目中去. 这里需要使用identity server 4 做单点登陆. 下面就简单学习一下相关的预备知 ...

  9. LDA-线性判别分析(一)预备知识

    本来是要调研 Latent Dirichlet Allocation 的那个 LDA 的, 没想到查到很多关于 Linear Discriminant Analysis 这个 LDA 的资料.初步看了 ...

随机推荐

  1. 深入了解Android蓝牙Bluetooth ——《总结篇》

    在我的上两篇博文中解说了有关android蓝牙的认识以及API的相关的介绍,蓝牙BLE的搜索,连接以及读取. 没有了解的童鞋们请參考: 深入了解Android蓝牙Bluetooth--<基础篇& ...

  2. Python下opencv使用笔记(十)(图像频域滤波与傅里叶变换)

    前面以前介绍过空间域滤波,空间域滤波就是用各种模板直接与图像进行卷积运算,实现对图像的处理,这个方案直接对图像空间操作,操作简单.所以也是空间域滤波. 频域滤波说究竟终于可能是和空间域滤波实现相同的功 ...

  3. Python中tab键自动补全功能的配置

    新手学习Python的时候,如何没有tab键补全功能,我感觉那将是一个噩梦,对于我们这种菜鸟来说,刚接触python,对一切都不了解,还好有前辈们的指导,学习一下,并记录下来,还没有学习这个功能小伙伴 ...

  4. POJ 3211 Washing Clothes 背包题解

    本题是背包问题,可是须要转化成背包的. 由于是两个人洗衣服,那么就是说一个人仅仅须要洗一半就能够了,由于不能两个人同一时候洗一件衣服,所以就成了01背包问题了. 思路: 1 计算洗完同一颜色的衣服须要 ...

  5. GC之二--GC是如何回收时的判断依据、shallow(浅) size、retained(保留) size、Deep(深)size

    回到问题“为何会内存溢出?”. 要回答这个问题又要引出另外一个话题,既什么样的对象GC才会回收? 一.对象存活方式判断方法 在上一篇文章<GC之一--GC 的算法分析.垃圾收集器.内存分配策略介 ...

  6. Linux下的CPU性能瓶颈分析案例

    问题描述: 在对notify执行性能测试时发现cpu负载突然飙高,cpu利用率高达95%.这时候就要排查是哪些线程消耗了cpu,并从代码层找到占用cpu的“罪魁祸首”. 步骤: 1. 先用ps+gre ...

  7. Python学习笔记(一)——基本知识点

    主要记录学习Python的历程和用于复习.查阅之用. 知识点: 数据类型(列表.元组.字典.集合) 帮助文档 函数(默认参数.可变参数.关键字参数.参数组合) 数据类型: 列表:list       ...

  8. #include”* .h“ 在查找预编译头使用时跳过

    warning C4627: “#include <windows.h>”:  在查找预编译头使用时跳过 解决办法: 原因是没有在cpp文件最前一行添加没有添加 #include &quo ...

  9. Quartz是一个完全由java编写的开源作业调度框架

    http://www.quartz-scheduler.org/ 找个时间研究一下

  10. day23<File类递归练习>

    File类递归练习(统计该文件夹大小) File类递归练习(删除该文件夹) File类递归练习(拷贝) File类递归练习(按层级打印) 递归练习(斐波那契数列) 递归练习(1000的阶乘所有零和尾部 ...