auth复习和BBS项目的登录(1)
?
?
auth復習
auth組件驗證:authenticate(request,username='andy',password='123) 登錄:login(request,user)注銷:login(request),內部調用了flush(),以后再從 request中取出user,是匿名函數request.user:請求來了.在中間件中.通過cookie查詢user信息,放到request.user中,如果查詢不到,把匿名客戶賦值給他登錄認證裝飾器:login_required(制定?后面拼接的是key值,如果沒有完整登錄,跳轉到拿個url)全局配置跳轉的url:在setting中:LOGIN_URL='/login/'創建用戶:create_superuser,creat_user,就只是一個字段區分校驗密碼:check_password(密碼),得用戶對象調用,如果校驗通過.,返回True修改密碼:set_password(密碼),修改了一定要調save方法.得用戶對象來調用是否通過驗證通過:is_authenticated,校驗用戶是否驗證通過,通常用在模板上刪除用戶:orm的刪除擴展auth組件:創建一個一對一的表模型,寫擴展的字段定義一個表模型,繼承AbstractUser,寫擴展的字段,數據庫遷移會報錯,取setting中配置:AUTH_USER_MODEL="app名字,表模型"其他用法完全一致,知識原來用User表模型,現在改成新定義的表模型?
關于創建項目的事項
在settings 中填寫數據庫相關信息,如果是MySql數據庫的話
DATABASES = {# 'default': {# 'ENGINE': 'django.db.backends.sqlite3',# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),# }'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'bbs','HOST': '127.0.0.1','PORT': 3306,'USER': 'root','PASSWORD': 'admin',} }?
記得在__init__.py中配置
import pymysql pymysql.install_as_MySQLdb()?
最好在settings中設置
?
STATIC_URL = '/static/'STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'), )AUTH_USER_MODEL = 'blog.UserInfo'?
?
?
BBS項目
1 數據結構分析
?
?
從上圖我們看出
①UserInfo----Blog 一個用戶表對應一個站點表,他們之間是一對一的關系,所以在任何一張表上加表關系都行
blog=models.OneToOneField(to='Blog',to_field='nid')②Blog---Category 一個用戶表也就是一個站點表對應多個文章分類,他們之間是一對多的關系,關聯數據加在Category中,即
blog=models.ForeignKey(to="Blog",to_field='nid',null=True)③Blog---Tag? 一個用戶表也就是一個站點表對應多個文章標簽表,他們之間是一對多的關系,關聯數據加在Tag中,即
blog=models.ForeignKey(to="Blog",to_field='nid',null=True)?
④ Category---Article一個文章分類對應多個文章(比如一個Python目錄下有多個關于python的文章),他們之間是一對多的關系,關系數據加在Article中,即
category=models.ForeignKey(to="Category",to_field='nid',null=True)⑤Tag---Article:一個標簽對應多個文章,一篇文章可以有多個標簽,他們是多對多的關系,我們可以創建第三張表,將Tag和Article都加進去
tag=models.ManyToManyField(to="Tag",through="ArticleTOTage",through_fields=('article','tag'))# 在Article中?
# 手動創建第三張表 class ArticleTOTage(models.Model):nid=models.AutoField(primary_key=True)article=models.ForeignKey(to='Article',to_field='nid')tag=models.ForeignKey(to='Tag',to_field='nid'?
⑥UserInfo---UpAndDown 一個用戶可以給不同的文章點贊,一個贊對應一個用戶,所以用戶和點贊,點踩與是一對多的關系,將關系創建在UpAndDown這張表中,即
user = models.ForeignKey(to='UserInfo', to_field='nid')UpandDown---Article? 一篇文章可以有很多的點贊數,每一個贊值對應一篇文章.,所以點贊和文章是一對多的關系,將關系表創建在UpAndDown這張表中,即
article = models.ForeignKey(to='Article', to_field='nid')⑦Commit---UserInfo;?一個用戶可以發很多評論,一個評論對應一個用戶,所以用戶和評論與是一對多的關系,將關系創建在Commit這張表中,即
user=models.ForeignKey(to='UserInfo',to_field='nid')Commit---Article 一篇文章有很多的評論,即文章很評論是一對多的關系,將表建在Commit中
article=models.ForeignKey(to='Article',to_field='nid')?
?⑧ Blog---Article? 個人站點和文章之間是一對多的關系,一個站點對應寫不同的文章,將關系表寫在Article中
blog=models.ForeignKey(to='blog',to_field='nid',null=True)?
model.py
from django.db import models from django.contrib.auth.models import AbstractUser# Create your models here.# UserInfo 這個表,繼承AbstracUser,因為要用suth組件 class UserInfo(AbstractUser):nid=models.AutoField(primary_key=True)# username=models.CharField(max_length=32,unique=True) phone=models.CharField(max_length=32,null=True)# 圖像avatar=models.FileField(upload_to='avatar/',default='/static/img/default.png')# 個人站點blog=models.OneToOneField(to='Blog',to_field='nid')class Blog(models.Model):#個人站點nid=models.AutoField(primary_key=True)title=models.CharField(max_length=64)# 標題site_name=models.CharField(max_length=32)#站點名theme=models.CharField(max_length=64)#主題class Category(models.Model):#文章分類表nid = models.AutoField(primary_key=True)title = models.CharField(max_length=64) # 標題blog=models.ForeignKey(to="Blog",to_field='nid',null=True)class Tag(models.Model):# 文章標簽表nid = models.AutoField(primary_key=True)title = models.CharField(max_length=64) # 標題blog=models.ForeignKey(to='Blog',to_field='nid',null=True)class Article(models.Model):# 文章表nid=models.AutoField(primary_key=True)title=models.CharField(max_length=64)desc=models.CharField(max_length=255)# 大文本content=models.TextField()# 創建時間,auto_now_add指的是把當前時間加上create_time=models.DateTimeField(auto_now_add=True)category=models.ForeignKey(to="Category",to_field='nid',null=True)blog=models.ForeignKey(to='blog',to_field='nid',null=True)tag=models.ManyToManyField(to="Tag",through="ArticleTOTage",through_fields=('article','tag'))# 手動創建第三張表 class ArticleTOTage(models.Model):nid=models.AutoField(primary_key=True)article=models.ForeignKey(to='Article',to_field='nid')tag=models.ForeignKey(to='Tag',to_field='nid')# 評論和點贊 class Commit(models.Model):nid=models.AutoField(primary_key=True)user=models.ForeignKey(to='UserInfo',to_field='nid')article=models.ForeignKey(to='Article',to_field='nid')content=models.CharField(max_length=32)create_time=models.DateTimeField(auto_now_add=True)# 自關聯parent_id=models.ForeignKey(to='self',to_field='nid')class UpAndDown(models.Model):nid = models.AutoField(primary_key=True)user = models.ForeignKey(to='UserInfo', to_field='nid')article = models.ForeignKey(to='Article', to_field='nid')is_up=models.BooleanField()class Meta:# 寫這些是為了不寫臟數據,聯合唯一unique_together=(('user','article'),) 創建數據庫?
2 登錄前端知識小結
login.html
<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><script src="/static/jQuery-3.3.1.js"></script><link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.min.css"><title>Title</title> </head> <body>{#container-fluid 可以自適應大小#} <div class="container-fluid">{# 用了class='row'才能用柵格系統#}<div class="row">{# 總共12個,占了6個,表格放在了中間#}<div class="col-md-6 col-md-offset-3"><form><h1>登錄</h1><meta charset="UTF-8"><div class="form-group">{# 將for里面協商input里面的id ,點擊label就會跳到對應的input框里面#}<label for="name">用戶名</label>{# class="form-control" 會獨占一行#}<input type="text" id="name" class="form-control"></div><div class="form-group"><label for="">密碼</label><input type="password" id="pwd" class="form-control"></div><div class="form-group"><label for="">驗證碼</label><div class="row"><div class="col-md-6"><input type="text" id="valid_code" class="form-control"></div><img height="35" width="300" src="/get_value_code/" alt=""></div></div>{#class="btn btn-primary" 生成一個藍色的按鈕 #}{# class="pull-right" 按扭靠向最右邊#}<input type="submit" value="登錄" class="btn btn-primary pull-right"></form></div></div> </div> </body> </html> View Code 知識點概括1 container-fluid 可以自適應大小2 總共12個,占了6個,表格放在了中間 <div class="col-md-6 col-md-offset-3">3 {#將for里面協商input里面的id ,點擊label就會跳到對應的input框里面#} <label for="name">用戶名</label>4 {#class="form-control" 會獨占一行#} <input type="text" id="name" class="form-control">5 class="btn btn-primary" 生成一個藍色的按鈕 #} {# class="pull-right" 按扭靠向最右邊#} <input type="submit" value="登錄" class="btn btn-primary pull-right">
?
?
?
驗證碼代碼實例
from django.shortcuts import render, HttpResponse from PIL import Image,ImageDraw,ImageFont import random # 管理bytes,從內存中讀取數據: # https://www.cnblogs.com/liuqingzheng/articles/10023849.html from io import BytesIO# Create your views here.def get_random_color():return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))def login(request):if request.method == 'GET':return render(request, 'login.html')def get_value_code(request):# with open('static/img/lhf.jpg','rb')as f:# 第一種方式# data=f.read()# return HttpResponse(data)# 第二種方式 隨機生成一張圖片# pip3 imstall Pillow# Pillow是一個圖像處理模塊,功能很強大# 第二種方式# 生成一張圖片# img = Image.new('RGB', (320, 35), color=get_random_color())# # 保存到本地# with open('valid_code.png', 'wb')as f:# img.save(f, 'png')# # with open('valid_code.png', 'rb')as f:# data = f.read()# return HttpResponse(data)# 第三種方式# img = Image.new('RGB', (320, 35), color=get_random_color())# # 在內存中生成一個文件,速度快# f = BytesIO() # 相當于在內存中打開了一個空文件# # 把圖片保存到f中# img.save(f, 'png')# data = f.getvalue()# # # return HttpResponse(data)# 第四種方式img=Image.new("RGB",(320,35),color=get_random_color())# 拿到畫筆,把圖片傳到畫筆img_draw=ImageDraw.Draw(img)# 生成一個字體對象,第一個參數是字體文件的路徑,第二個參數是字體大小font=ImageFont.truetype('static/font/ss.TTF',size=25)# 第一個參數:xy的坐標,第二個參數:要寫的文字,第三個參數:寫文字的顏色,第四個參數:字體 img_draw.text((0,0),'python',get_random_color(),font=font),# 聯合唯一f=BytesIO()img.save(f,'png')data=f.getvalue()return HttpResponse(data) View Code圖片驗證第一種方式
with open('static/img/lhf.jpg','rb')as f: data=f.read() return HttpResponse(data)?
圖片驗證第二種方式
# pip3 imstall Pillow 安裝pillow模塊 Pillow是一個圖像處理模塊,功能很強大 from PIL import Image import randomdef get_random_color():return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))img = Image.new('RGB',(320,35),color=get_random_color())with open('valid_code.png', 'wb')as f:img.save(f, 'png')with open('valid_code.png', 'rb')as f:data = f.read()return HttpResponse(data)?
?
第三種方式
from io import BytesIO from PIL import Image img = Image.new('RGB', (320, 35), color=get_random_color()) f = BytesIO()# 相當于在內存中打開了一個空文件 #把圖片保存到f中 img.save(f, 'png') data = f.getvalue() return HttpResponse(data)
?
第四種方式(推薦)
?
from PIL import Image,ImageDraw,ImageFont import random from io import BytesIO def get_random_color():return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) def get_value_code(request): img=Image.new("RGB",(320,35),color=get_random_color()) # 拿到畫筆,把圖片傳到畫筆 img_draw=ImageDraw.Draw(img) # 生成一個字體對象,第一個參數是字體文件的路徑,第二個參數是字體大小 font=ImageFont.truetype('static/font/ss.TTF',size=25) # 第一個參數:xy的坐標,第二個參數:要寫的文字,第三個參數:寫文字的顏色,第四個參數:字體 img_draw.text((0,0),'python',get_random_color(),font=font), f=BytesIO() img.save(f,'png') data=f.getvalue() return HttpResponse(data)?
轉載于:https://www.cnblogs.com/ouyang99-/p/10027053.html
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的auth复习和BBS项目的登录(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CentOS7.2安装Python3.6
- 下一篇: [BZOJ2599]Race