一、中介模型

  1. 四个项目:
  2. 苑昊
  3.  
  4. 博客(BBS (7-8)
  5.  
  6. CRM
  7. 1.权限组件 (3)
  8. 2.start组件 -- admin (5)
  9. 1.使用
  10. 2.源码 django 源码 (面向对象)
  11. 以源码为导师
  12. 使用python最顶头的人写出来的
  13. 3.开发类似于源码的组件
  14. 4.面向对象。。。优点。。。
  15. 3.crm (4)
  16.  
  17. 路飞学城
  18. 1.vue (3)
  19. 2.rest-framework (4)
  20. 3.路飞学诚
  21.  
  22. 爬虫
  23. linux
  24. flask
  25.  
  26. -------------------------------------------------
  27. Book():
  28. title =
  29. publish = models.ForeignKey(to='Publish',to_field='id')
  30. authors = models.manytomany(to='author')
  31.  
  32. Publish():
  33. name=
  34. email=
  35.  
  36. Author():
  37. name=
  38.  
  39. book author
  40. id book_id author_id
  41. 1 1 1
  42.  
  43. class book2author():
  44. id=
  45. book=models.ForeignKey('Book')
  46. author=models.ForeignKey('Author')
  47. xxx=models...
  48.  
  49. book2author
  50. id book_id author_id
  51. 1 1 1
  52.  
  53. book_obj = Book.object.filter(pk=1).first()
  54. book_obj.authors.all()
  55. book_obj.authors.add(1,2)
  56. book_obj.authors.set([1,2]) 刷新在插入
  57. remove 解除
  58. clear 全解除
  59.  
  60. 如果没有 // authors = models.manytomany(to='author')
  61. Book2author.object.create(book_id=1,author_id=2)
  62. 意味着 跨表查询没有了 正向查询按字段 反向查询按表名
  63. 那如果用字段authors = models.manytomany(to='author'),但是第三张表用自己的!
  64. authors = models.manytomany(to='author',through="Book2Author")...通过through
  65. 以后跨表查询就走的是自己建的表,(中介模型)自己建的表(Book2Author叫中介模型)可进行扩展
  66.  
  67. 中介模型:第三张表 可以create 可不可以add 不可以!!
  68. Book2author.object.create(book_id=1,author_id=2)
  69. book_obj.authors.add(1,2) 这个方法就不能使用了!!否则就会报错 add set remove clear 都不能用了

笔记

  1. 中介模型:
    只针对 多对多
    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 = ... # 有可能有多个字段。。扩展

二、简介

  1. 博客系统(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
  2.  
  3. 实现功能:
    1.基于Ajax和用户认证实现登录验证!
    --- 验证码 图片 滑动(插件)
    登录 注册 Ajax
  4.  
  5. 2.基于Ajaxform组件实现注册功能!
  6.  
  7. 3.系统首页的布局
    https://www.cnblogs.com/
  8.  
  9. 表关系 第一步:
    文章表: 表头 内容,发布时间
    用户表: 一对多
  10.  
  11. 4.个人站点页面设计
    https://www.cnblogs.com/wupeiqi
    https://www.cnblogs.com/linhaifeng
  12.  
  13. 标签 分类 归档(发布日期 group by
    分类表:一对多 和文章表
    标签表:多对多 和文章表
  14.  
  15. 5.文章详细页面
    模板继承
    文章表 content内容非常多,分成两张表,否则会每次都查所有的字段;
    Artical
    id
    title ...
    desc ...
    create_time ...
    ad_id = models.OneToOne() 1 / 5
    ArticalDetail:
    id
    content ...
    一对一
  16.  
  17. 6.基于Ajax实现文章点赞与踩灭
    描述行为的就是数据;
    ArticalUpDown
    id
    user_id
    artical_id
    is_up true false
    ( user_id artical_id 联合唯一 unqiue_together )
    ArticalUpDown.object.create()
  18.  
  19. 7.基于Ajax实现评论框
    Comment:
    id
    user_id
    artical_id
    create_time
    content
  20.  
  21. 对文章的评论和对评论的评论
    评论树:
    111
    444
    555
    666
    222
    333
    评论楼:
    直接按时间下来的
  22.  
  23. user
    id name
    1 alex
    2 egon
  24.  
  25. 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
  26.  
  27. create Comment():
    id = ...
    user = models.ForeignKey('User')
    artical = models.ForeignKey('Artical')
    create_time =
    content = ...
    pid = models.ForeignKey("selef",null=true,default=None) # 表的自关联
  28.  
  29. 8.kindeditor 文本编辑器
    防止跨域,安全攻击!发文章 有些<js>恶意攻击
    思路:1.转义,对文章过滤,<script></script>
    beautitulSoup 模块
  1. 表设计:
  2. Artical
  3. id
  4. title
  5. desc
  6. create_time
  7. ad_id = models.OneToOne('ArticalDetail')
  8. type_id = models.ForeignerKey('Type')
  9. tag_id = models.ManyToMany('Tag')
  10.  
  11. ArticalDetail: 一对一
  12. id
  13. content
  14.  
  15. User:
  16. id
  17. username
  18. password
  19.  
  20. Type 分类表: 一对多
  21. id
  22. name
  23.  
  24. Tag 标签表: 多对多
  25. id
  26. name
  27.  
  28. ArticalUpDown 点赞踩灭表: 联合唯一 unique(user_id,artical_id)
  29. id
  30. user_id = models.ForeignKey('User')
  31. artical_id = models.ForeignKey('Artical')
  32. is_up true/false
  33.  
  34. Comment 评论表 注意:对文章的评论和对评论的评论:评论树,评论楼, 表的自关联(null=true)
  35. id
  36. user_id = models.ForeignKey('User')
  37. artical_id = models.ForeignKey('Artical')
  38. create_time
  39. content
  40. p_id = models.ForeignKey('self',null=true,default=None)
  41. #(记录父评论) None / 1 / 4 / ...

表设计

三、cookie session

  1. cookie session
  2.  
  3. request.session['key'] = 'value'
    request.session.get('key')
  4.  
  5. 必须要知道源码流程,知其然还要知其所以然
  6.  
  7. 用户认证组件(基于session)(auth / User)
  1. session
  2.  
  3. 1.使用
  1. def login(request):
  2. if request.method == 'POST':
  3. user = request.POST.get('user')
  4. pwd = request.POST.get('pwd')
  5.  
  6. user = models.UserInfo.objects.filter(name=user,pwd=pwd).first()
  7. if user:
  8. request.session['username'] = user.name
  9. request.session['user_id'] = user.pk
  10. return redirect('/index/')
  11. else:
  12. return render(request,'login.html')
  13.  
  14. return render(request,'login.html')
  15.  
  16. def index(request):
  17. username = request.session.get('username')
  18. if not username:
  19. return redirect('/login/',)
  20. return render(request,'index.html',{'username':username})
  1. 2.分析session
    django 到了做了什么,其他框架没有session组件!!
  2.  
  3. 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
  4.  
  5. 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)
  6.  
  7. 疑问:
    同一个浏览器多个用户登录:session表里不会多一个数据,除非换了浏览器;
    第二次访问,代码发生了什么事情!session表里,一个浏览器一条记录!
    每个浏览器都维持一个cookie !为什么这样?源码
  8.  
  9. 第一次浏览器访问,取不出来session_id 就创建,一条记录 create
    第二次浏览器访问,能取出来session_id,就更新,不在是创建 update
  10.  
  11. 3.查看源码
    from django.contrib.sessions.middleware import SessionMiddleware
    def process_request(self, request):pass
    def process_response(self, request, response):pass
  12.  
  13. 注意:
    1.def process_request(self, request):pass
    django 有两个settings
    用户级别 比 系统级别的高,可覆盖!
  14.  
  15. from django.contrib.sessions.backends import db
    class SessionStore(SessionBase):pass
    request.session = self.SessionStore(session_key)
  16.  
  17. 所以:request.session 是一个空对象
    能这样赋值使因为:request.session['username'] = 'alex'
    def __getitem__(self, key):
    return self._session[key]
  18.  
  19. def __setitem__(self, key, value):
    self._session[key] = value
    self.modified = True
  20.  
  21. 结果:得到一个request.session空对象{}
    视图函数里赋值:
    request.session['username'] = 'alex'
  22.  
  23. 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 有,就更新,没有,就创建;
  24.  
  25. 总结:
    session源码:
    请求:http://127.0.0.1:8080/login post name=alex&pwd=123
    第一站:
    中间件SessionMiddleWare的process_request
  26.  
  27. def process_request():
    request.session = self.SessionStore(session_key)
    _session = {}
    _session_cache = {}
  28.  
  29. 第二站:views:
    def login(request):
    user = request.POST.get('user')
    pwd = request.POST.get('pwd')
  30.  
  31. 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')
  32.  
  33. 操作:
    执行 self.SessionStore(session_key)类下的__setitem__():
    self._session_cache = {'username':'alex','user_id',1}
  34.  
  35. 第三站:中间件 SessionMiddleware的process_response():
    存储记录:
    if self._session_key:
    self._session_key = 'asdas23213123ssasda'
    self.save(must_create=True)
  36.  
  37. self.save(must_create=False)
    写Cookie
    response.set_cookie(
    'session_id',
    self._session_key,
    )
  38.  
  39. 看源码:理解,学习,使用!!
  40.  
  41. 4.django得流程
    浏览器 (请求首行 请求头 请求体) wsgi (http协议整理数据 解析数据) 中间件 url views orm
    中间件 process_request process_response process_view process_exception process_template_response
  42.  
  43. wsgi 功能:1.解析请求的数据,request 之后随便用
    2.响应体 view 返回 字符串,返回浏览器 按响应格式返回,否则浏览器不识别(响应首行,响应头)

四、用户认证组件

  1. python manage.py makemigrations
    python manage.py migrate
    也可以:
    Tools / Run manage.py Task
    makemigrations
    migrate
  2.  
  3. -------------------------
  4.  
  5. 用户认证组件:
  6.  
  7. from django.contrib import auth
    from django.contrib.auth.models import User
  8.  
  9. auth
    针对 auth_user
    创建超级用户:
    python manage.py createsuperuser
    root root1234
    alex alex1234
  10.  
  11. 1.user = auth.authenticate(username=user, password=pwd)
    成功返回用户对象 <class 'django.contrib.auth.models.User'>
    失败返回 None
  12.  
  13. 2.auth.login(request,user)
    request.session['user_id'] = user.pk
    # request.user = user # 不能用这个 否则多个人 就串了!!
    request.user = User.objects.filter(pk=user.pk).first()
  14.  
  15. 就可以 调用
    request.user 匿名对象 / 该用户对象
  16.  
  17. 3.auth.logout(request)
    request.session.flush()
  18.  
  19. 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')
    权限用户 超级用户 所有表的所有权限

    示例:
  1. from django.shortcuts import render,HttpResponse,redirect
  2. from django.contrib import auth
  3. from django.contrib.auth.models import User
  4.  
  5. def login(request):
  6. if request.method == 'POST':
  7. user = request.POST.get('user')
  8. pwd = request.POST.get('pwd')
  9. user = auth.authenticate(username = user,password=pwd)
  10. if user:
  11. auth.login(request,user)
  12. return redirect('/index/')
  13. return render(request,'login.html')
  14.  
  15. def index(request):
  16. username = request.user.username
  17. if not request.user.is_authenticated:
  18. # if not username:
  19. return redirect('/login/')
  20. return render(request,'index.html',{'username':username})
  21.  
  22. def logout(request):
  23. auth.logout(request)
  24. return redirect('/login/')
  25.  
  26. def reg(request):
  27. if request.method == 'POST':
  28. user = request.POST.get('user')
  29. pwd = request.POST.get('pwd')
  30. user = User.objects.create_user(username=user,password=pwd)
  31. auth.login(request,user)
  32. return redirect('/index/')
  33. return render(request,'login.html')
  1.  
  1. ?既想用 auth_user 表,还想扩展,表字段如何做呢?
  2.  
  3. models.py
    from django.db import models
    from django.contrib.auth.models import User,AbstractUser
  4.  
  5. # 用类继承
    # userinfo 和 auth_user 合成一张表
    # 因此可以用登录认证的功能
  6.  
  7. class UserInfo(AbstractUser):
    tel = models.CharField(max_length=32)
  8.  
  9. # settings配置 若没有,报错'UserInfo.groups';
    AUTH_USER_MODEL = 'app01.UserInfo'
  10.  
  11. Tools / Run manage.py Task
    makemigrations
    migrate
  12.  
  13. 新生成得表 app01_userinfo (可以用登录认证的功能)
    字段就是 auth_user UserInfo 得合成!!

  1.  

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. 使用_snscanf_s转换十六进制时引起的内存越界

    //将Hex编码转换为指定编码格式的字符串 string Encoding::DecodeHexString(const string &strSrc, UINT code_page ) { ...

  2. 关于RSSI的问题

    1.为什么RSSI是负值,其实归根到底为什么接收的无线信号是负值,这样子是不是容易理解多了.因为无线信号多为mW级别,所以对它进行了极化,转化为dBm而已,不表示信号是负的.1mW就是0dBm,小于1 ...

  3. iOS private-api-checker私有API检测

    转自: http://www.jianshu.com/p/07779e293ca7 注:  '根目录' 指的是 private-api-checker 包的目录 iOS-private-api-che ...

  4. 资深投资人全力反击: VC增值平台从来就不是一坨狗屎

    编者注: 本文来自海外著名科技博客VentureBeat, 英文原文出自Kyle Lacy之手 ,中文版由天地会珠海分舵进行编译. 文章主要是针对前几天德国VC Christian Claussen的 ...

  5. LINUX 环境变量总结

    1.概述 Linux是一个多用户的操作系统.多用户意味着每个用户登录系统后,都有自己专用的运行环境.而这个环境是由一组变量所定义,这组变量被称为环境变量.用户可以对自己的环境变量进行修改以达到对环境的 ...

  6. ChemDraw教程:如何查看和删除俗名

    化学范畴里,允许用俗名表示ChemDraw原子标记或原子标记的一部分,可以定义俗名的快捷键也可以自由查看或删除俗名,熟练掌握可以提高ChemDraw软件使用效率,下面将具体介绍此部分内容. 一.查看俗 ...

  7. findmaven的英文版本号上线了

    http://www.findmaven.net是一个查找Jar和查找Maven的Maven仓库搜索引擎.它能够依据Java开发人员提供的Class名或者Jar名找到包括它的Jar,同一时候提供Jar ...

  8. EF的代码优先设计

    CodeFirst 用中文说是代码优先,此技术可以让我们先写代码,然后由Entity Framework根据我们的代码建立数据库 接下来用学生这个例子来演示,有学生表,课程表,和成绩表三张表 首先是M ...

  9. Python 中文乱码

    1.首行添加 # -*- coding:gb2312 -*- # -*- coding:utf-8 -*- 2.PyCharm设置 在File->setting->File Encodin ...

  10. /etc/docker/key.json

    /etc/docker/key.json 描述信息: This is the dockerd key for TLS connections.in web format, that docker us ...