auth复习和BBS项目的登录(1)
?
?
auth復(fù)習(xí)
auth組件驗(yàn)證:authenticate(request,username='andy',password='123) 登錄:login(request,user)注銷:login(request),內(nèi)部調(diào)用了flush(),以后再?gòu)?request中取出user,是匿名函數(shù)request.user:請(qǐng)求來(lái)了.在中間件中.通過(guò)cookie查詢user信息,放到request.user中,如果查詢不到,把匿名客戶賦值給他登錄認(rèn)證裝飾器:login_required(制定?后面拼接的是key值,如果沒(méi)有完整登錄,跳轉(zhuǎn)到拿個(gè)url)全局配置跳轉(zhuǎn)的url:在setting中:LOGIN_URL='/login/'創(chuàng)建用戶:create_superuser,creat_user,就只是一個(gè)字段區(qū)分校驗(yàn)密碼:check_password(密碼),得用戶對(duì)象調(diào)用,如果校驗(yàn)通過(guò).,返回True修改密碼:set_password(密碼),修改了一定要調(diào)save方法.得用戶對(duì)象來(lái)調(diào)用是否通過(guò)驗(yàn)證通過(guò):is_authenticated,校驗(yàn)用戶是否驗(yàn)證通過(guò),通常用在模板上刪除用戶:orm的刪除擴(kuò)展auth組件:創(chuàng)建一個(gè)一對(duì)一的表模型,寫(xiě)擴(kuò)展的字段定義一個(gè)表模型,繼承AbstractUser,寫(xiě)擴(kuò)展的字段,數(shù)據(jù)庫(kù)遷移會(huì)報(bào)錯(cuò),取setting中配置:AUTH_USER_MODEL="app名字,表模型"其他用法完全一致,知識(shí)原來(lái)用User表模型,現(xiàn)在改成新定義的表模型?
關(guān)于創(chuàng)建項(xiàng)目的事項(xiàng)
在settings 中填寫(xiě)數(shù)據(jù)庫(kù)相關(guān)信息,如果是MySql數(shù)據(jù)庫(kù)的話
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中設(shè)置
?
STATIC_URL = '/static/'STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'), )AUTH_USER_MODEL = 'blog.UserInfo'?
?
?
BBS項(xiàng)目
1 數(shù)據(jù)結(jié)構(gòu)分析
?
?
從上圖我們看出
①UserInfo----Blog 一個(gè)用戶表對(duì)應(yīng)一個(gè)站點(diǎn)表,他們之間是一對(duì)一的關(guān)系,所以在任何一張表上加表關(guān)系都行
blog=models.OneToOneField(to='Blog',to_field='nid')②Blog---Category 一個(gè)用戶表也就是一個(gè)站點(diǎn)表對(duì)應(yīng)多個(gè)文章分類,他們之間是一對(duì)多的關(guān)系,關(guān)聯(lián)數(shù)據(jù)加在Category中,即
blog=models.ForeignKey(to="Blog",to_field='nid',null=True)③Blog---Tag? 一個(gè)用戶表也就是一個(gè)站點(diǎn)表對(duì)應(yīng)多個(gè)文章標(biāo)簽表,他們之間是一對(duì)多的關(guān)系,關(guān)聯(lián)數(shù)據(jù)加在Tag中,即
blog=models.ForeignKey(to="Blog",to_field='nid',null=True)?
④ Category---Article一個(gè)文章分類對(duì)應(yīng)多個(gè)文章(比如一個(gè)Python目錄下有多個(gè)關(guān)于python的文章),他們之間是一對(duì)多的關(guān)系,關(guān)系數(shù)據(jù)加在Article中,即
category=models.ForeignKey(to="Category",to_field='nid',null=True)⑤Tag---Article:一個(gè)標(biāo)簽對(duì)應(yīng)多個(gè)文章,一篇文章可以有多個(gè)標(biāo)簽,他們是多對(duì)多的關(guān)系,我們可以創(chuàng)建第三張表,將Tag和Article都加進(jìn)去
tag=models.ManyToManyField(to="Tag",through="ArticleTOTage",through_fields=('article','tag'))# 在Article中?
# 手動(dòng)創(chuàng)建第三張表 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 一個(gè)用戶可以給不同的文章點(diǎn)贊,一個(gè)贊對(duì)應(yīng)一個(gè)用戶,所以用戶和點(diǎn)贊,點(diǎn)踩與是一對(duì)多的關(guān)系,將關(guān)系創(chuàng)建在UpAndDown這張表中,即
user = models.ForeignKey(to='UserInfo', to_field='nid')UpandDown---Article? 一篇文章可以有很多的點(diǎn)贊數(shù),每一個(gè)贊值對(duì)應(yīng)一篇文章.,所以點(diǎn)贊和文章是一對(duì)多的關(guān)系,將關(guān)系表創(chuàng)建在UpAndDown這張表中,即
article = models.ForeignKey(to='Article', to_field='nid')⑦Commit---UserInfo;?一個(gè)用戶可以發(fā)很多評(píng)論,一個(gè)評(píng)論對(duì)應(yīng)一個(gè)用戶,所以用戶和評(píng)論與是一對(duì)多的關(guān)系,將關(guān)系創(chuàng)建在Commit這張表中,即
user=models.ForeignKey(to='UserInfo',to_field='nid')Commit---Article 一篇文章有很多的評(píng)論,即文章很評(píng)論是一對(duì)多的關(guān)系,將表建在Commit中
article=models.ForeignKey(to='Article',to_field='nid')?
?⑧ Blog---Article? 個(gè)人站點(diǎn)和文章之間是一對(duì)多的關(guān)系,一個(gè)站點(diǎn)對(duì)應(yīng)寫(xiě)不同的文章,將關(guān)系表寫(xiě)在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 這個(gè)表,繼承AbstracUser,因?yàn)橐胹uth組件 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')# 個(gè)人站點(diǎn)blog=models.OneToOneField(to='Blog',to_field='nid')class Blog(models.Model):#個(gè)人站點(diǎn)nid=models.AutoField(primary_key=True)title=models.CharField(max_length=64)# 標(biāo)題site_name=models.CharField(max_length=32)#站點(diǎn)名theme=models.CharField(max_length=64)#主題class Category(models.Model):#文章分類表nid = models.AutoField(primary_key=True)title = models.CharField(max_length=64) # 標(biāo)題blog=models.ForeignKey(to="Blog",to_field='nid',null=True)class Tag(models.Model):# 文章標(biāo)簽表nid = models.AutoField(primary_key=True)title = models.CharField(max_length=64) # 標(biāo)題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()# 創(chuàng)建時(shí)間,auto_now_add指的是把當(dāng)前時(shí)間加上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'))# 手動(dòng)創(chuàng)建第三張表 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')# 評(píng)論和點(diǎn)贊 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)# 自關(guān)聯(lián)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:# 寫(xiě)這些是為了不寫(xiě)臟數(shù)據(jù),聯(lián)合唯一unique_together=(('user','article'),) 創(chuàng)建數(shù)據(jù)庫(kù)?
2 登錄前端知識(shí)小結(jié)
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 可以自適應(yīng)大小#} <div class="container-fluid">{# 用了class='row'才能用柵格系統(tǒng)#}<div class="row">{# 總共12個(gè),占了6個(gè),表格放在了中間#}<div class="col-md-6 col-md-offset-3"><form><h1>登錄</h1><meta charset="UTF-8"><div class="form-group">{# 將for里面協(xié)商input里面的id ,點(diǎn)擊label就會(huì)跳到對(duì)應(yīng)的input框里面#}<label for="name">用戶名</label>{# class="form-control" 會(huì)獨(dú)占一行#}<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="">驗(yàn)證碼</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" 生成一個(gè)藍(lán)色的按鈕 #}{# class="pull-right" 按扭靠向最右邊#}<input type="submit" value="登錄" class="btn btn-primary pull-right"></form></div></div> </div> </body> </html> View Code 知識(shí)點(diǎn)概括1 container-fluid 可以自適應(yīng)大小2 總共12個(gè),占了6個(gè),表格放在了中間 <div class="col-md-6 col-md-offset-3">3 {#將for里面協(xié)商input里面的id ,點(diǎn)擊label就會(huì)跳到對(duì)應(yīng)的input框里面#} <label for="name">用戶名</label>4 {#class="form-control" 會(huì)獨(dú)占一行#} <input type="text" id="name" class="form-control">5 class="btn btn-primary" 生成一個(gè)藍(lán)色的按鈕 #} {# class="pull-right" 按扭靠向最右邊#} <input type="submit" value="登錄" class="btn btn-primary pull-right">
?
?
?
驗(yàn)證碼代碼實(shí)例
from django.shortcuts import render, HttpResponse from PIL import Image,ImageDraw,ImageFont import random # 管理bytes,從內(nèi)存中讀取數(shù)據(jù): # 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)# 第二種方式 隨機(jī)生成一張圖片# pip3 imstall Pillow# Pillow是一個(gè)圖像處理模塊,功能很強(qiáng)大# 第二種方式# 生成一張圖片# 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())# # 在內(nèi)存中生成一個(gè)文件,速度快# f = BytesIO() # 相當(dāng)于在內(nèi)存中打開(kāi)了一個(gè)空文件# # 把圖片保存到f中# img.save(f, 'png')# data = f.getvalue()# # # return HttpResponse(data)# 第四種方式img=Image.new("RGB",(320,35),color=get_random_color())# 拿到畫(huà)筆,把圖片傳到畫(huà)筆img_draw=ImageDraw.Draw(img)# 生成一個(gè)字體對(duì)象,第一個(gè)參數(shù)是字體文件的路徑,第二個(gè)參數(shù)是字體大小font=ImageFont.truetype('static/font/ss.TTF',size=25)# 第一個(gè)參數(shù):xy的坐標(biāo),第二個(gè)參數(shù):要寫(xiě)的文字,第三個(gè)參數(shù):寫(xiě)文字的顏色,第四個(gè)參數(shù):字體 img_draw.text((0,0),'python',get_random_color(),font=font),# 聯(lián)合唯一f=BytesIO()img.save(f,'png')data=f.getvalue()return HttpResponse(data) View Code圖片驗(yàn)證第一種方式
with open('static/img/lhf.jpg','rb')as f: data=f.read() return HttpResponse(data)?
圖片驗(yàn)證第二種方式
# pip3 imstall Pillow 安裝pillow模塊 Pillow是一個(gè)圖像處理模塊,功能很強(qiáng)大 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()# 相當(dāng)于在內(nèi)存中打開(kāi)了一個(gè)空文件 #把圖片保存到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()) # 拿到畫(huà)筆,把圖片傳到畫(huà)筆 img_draw=ImageDraw.Draw(img) # 生成一個(gè)字體對(duì)象,第一個(gè)參數(shù)是字體文件的路徑,第二個(gè)參數(shù)是字體大小 font=ImageFont.truetype('static/font/ss.TTF',size=25) # 第一個(gè)參數(shù):xy的坐標(biāo),第二個(gè)參數(shù):要寫(xiě)的文字,第三個(gè)參數(shù):寫(xiě)文字的顏色,第四個(gè)參數(shù):字體 img_draw.text((0,0),'python',get_random_color(),font=font), f=BytesIO() img.save(f,'png') data=f.getvalue() return HttpResponse(data)?
轉(zhuǎn)載于:https://www.cnblogs.com/ouyang99-/p/10027053.html
超強(qiáng)干貨來(lái)襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的auth复习和BBS项目的登录(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: CentOS7.2安装Python3.6
- 下一篇: [BZOJ2599]Race