Auth的補充
#概念:是django 的一個app,關于用戶的登錄,退出,注冊...
# 配置文件中配置:表會被遷移INSTALLED_APPS = ['django.contrib.auth',]
# auth有哪些表---權限控制:
Permission:auth_permission Group:auth_group User:auth_user ?--->密碼加密auth_group_permissions auth_user_groups auth_user_user_permissions
# 目前階段只用 auth_user來做用戶的一些操作
# 如果用戶沒登錄:
request.user取出的是匿名用戶:
????????AnonymousUser類的對象,也有pk,name,is_authenticated
# 模塊常用方法:
1 user = authenticate(username='usernamer',password='password')# 校驗用戶:必須傳username和password user = authenticate(username='usernamer',password='password') from django.contrib.auth.models import User user=User.objects.filter(username=username).first() if user and user.check_password(password):print('用戶名密碼正確') else:print('用戶名密碼錯誤')
2 login:用戶校驗通過,讓它登錄,執行它
? ? ?? ?-當前登錄用戶寫入到session中
? ? ?? ?-后續 request.user 就能拿到當前登錄用戶auth.login(request, user) user=request.user
3 logout:退出,清空session
4 request.user.is_authenticated:返回True或False
5 login_requierd :登錄認證裝飾器,放在視圖函數上 ,會重定向
? ? ? ? ????????@login_required(login_url='/login/')
6 create_user:普通用戶
? ? ?? ?-User.objects.create()--密碼是加密的---》這樣存密碼是明文的
7 create_superuser:超級用戶 ?python38 manage.py createsuperuser8 check_password :通過明文密碼校驗密碼是否正確
9 set_password:修改密碼user.set_password(new_password) user.save()
10 User對象的屬性:
username?
password
is_staff : 用戶是否擁有網站的管理權限,能不能登錄admin后臺管理
is_active: 是否允許用戶登錄, 設置為 False,可以在不刪除用戶的前提下禁止用戶登錄
? ? ? ? ? ?????????????is_active是False----authenticate也查不出來
is_superuser:是否是超級管理員,admin中權限最高# auth模塊的密碼加密:同樣的密碼--》再次加密--》密文也不一樣
?? ?pbkdf2_sha256$ ? # 加密方式?
? ? 260000$? ? ? ? ? ? ? ?#過期時間
? ? H93ubuUFw6FbYc6B8ojzKA$? ? ? ? ? ? ??# 隨機串,,秘鑰
? ? H0ZnaiJOm/pI4K802Y2TcO5SQ7iWDcx5E+mb/hdABd8=? ? ? ?#明文加密后的
# 后期如果你自己寫了User表,但是想用人家的密碼加密,就可以使用?res=make_password('123456') check_password(明文,密文)
擴寫auth的user表
# 第一種方案:通過一對一擴展(基本不用)
from django.contrib.auth.models import User class UserDetail(models.Model):user=models.OneToOneField(to=User)phone=models.CharField(max_length=32)
# 第二種:通過繼承 AbstractUser表來擴寫
1、在models.py中寫用戶表from django.contrib.auth.models import AbstractUser class UserInfo(AbstractUser):# 原來有的字段就不需要寫了,只需要擴寫你想寫的字段mobile=models.CharField(max_length=32)icon=models.ImageField(upload_to='/icon/',default='default.png') # 路徑和默認值
2、在settings.py 配置
AUTH_USER_MODEL='app名字.表名' # 不區分大小寫 AUTH_USER_MODEL='app01.UserInfo'
3、之前不要遷移數據,一旦遷移過,就不行了
? ? ? 一旦遷移過了,按這個步驟操作:
? ? ? ? ?? ?-1 刪庫
? ? ? ? ? ? -2 刪遷移文件(所有你寫的app都刪)
? ? ? ? ? ? -3 刪除源碼中 auth和admin的遷移文件---》寫在djagno重裝
緩存
# 概念:緩存又稱頁面靜態化,?django 默認就支持緩存
# 原由:本身數據在數據庫中,如果訪問量較大,每次都需要去數據庫查詢,影響效率。????????可以對數據做緩存,以后先從緩存中取數據
????????如果取到:直接返回,不需要查數據庫
????????如果取不到:再查數據庫,查完放到緩存中
# 緩存到的位置:? ? ? ? ? ?
? ? ? ? ? ? 內存緩存(演示)
? ??????????文件緩存?
? ? ????????數據庫緩存
?? ?????????redis緩存(后期會用)? ??
# 默認情況,緩存到內存中CACHES = {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',} }
# 緩存到文件中
CACHES = {'default': {'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定緩存使用的引擎'LOCATION': 'D:\pythonproject\huancun_file', ? ? ? ?#指定緩存的路徑'OPTIONS':{'MAX_ENTRIES': 300, ? ? ? ? ? ?# 最大緩存記錄的數量(默認300)'CULL_FREQUENCY': 3, ? ? ? ? ? # 緩存到達最大個數之后,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3)}} ??}
# 緩存的具體使用:三種粒度
?? ?1 全站緩存:只需要置兩個中間件即可? ? ? ??
? ? 2 視圖緩存
? ? 3 局部緩存:在頁面某個位置緩存? ??
#? 全站緩存,使用方式-如下-只需要配置中間件即可MIDDLEWARE = ['django.middleware.cache.UpdateCacheMiddleware',...'django.middleware.cache.FetchFromCacheMiddleware' ]
# 視圖緩存
from django.views.decorators.cache import cache_page @cache_page(timeout=10) def demo09(request):print('來了老弟')book_list = Book.objects.all()return render(request, 'books.html', {'books': book_list})
# 局部緩存
{% load cache %} {% cache 10 'name' %} 可以能有很多代碼 {% endcache %}
項目開發流程
項目立項——公司高層定的
需求調研和分析-——市場人員,技術人員
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?需求文檔 說明? ?
開發部門開會——確定項目架構,技術選型,數據庫設計
ui,ud團隊(產品經理)——原型圖---切圖--交給前端
分任務開發:
?? ?????????-前端
? ????????? -后端:對著原型圖--》設計--》設計數據庫,設計功能? ??
前后端聯調
提交版本——測試
發布上線
BBS項目功能
1、注冊功能:校驗
? ????????????????ajax注冊
? ? ??????????????頭像顯示和上傳
2、登錄
3、首頁文章顯示(分頁---》自己加上)
4、個人站點:顯示這個人寫的所有文章
? ? ??????????????側邊欄有分類,標簽,隨筆檔案
5、文章詳情
6、點贊,點踩
7、評論:根評論
? ? ???????子評論
8、后臺管理:查看所有文章
? ????????????????刪除文章
? ? ??????????????新增文章:xss攻擊去除
設計數據庫
1 用戶表 UserInfo--->擴寫auth的user表
2 博客表 Blog--->跟用戶表做一對一關聯
3 文章表 Article
4 文章分類表 ?Category
5 標簽表 ?Tag
6 點贊點踩表 ?UpAndDown
7 評論表 ?Commit# 關聯關系:
????????用戶和博客 :? 一對一
????????博客和文章: 一對多? 一個博客下,有很多文章,關聯字段寫在文章表中
????????博客和分類: 一對多? 一個博客下,創建多個分類,關聯字段寫在分類表中
????????博客和標簽:? ? 一對多? 一個博客下,創建多個標簽,關聯字段寫在標簽表中????????文章和分類: 一對多? ?一個文章只能屬于一個分類,一個分類下有很多文章
????????文章和標簽:多對多 ? ?一個文章可以有多個標簽,一個標簽下可以有多個文章????????點贊和用戶:一對多 ?一個用戶可以點很多贊,一個用戶可以點很多贊
????????評論和用戶:一對多 ?一個用戶可以評論多個,評論的一條記錄只屬于一個用戶????????文章和點贊:一對多 一篇文章,可以被點多次,但是一個點贊的記錄只對應一篇文章
????????文章和評論:一對多 一篇文章,可以被評論多次,但一個評論的記錄只對應一篇文章
setting文件配置
# 解釋器環境中有 djagno ==3.2.20
# 1 國際化:LANGUAGE_CODE = 'zh-hans' TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = True USE_TZ = False
# 2 配置了static
STATIC_URL = '/static/' STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
# 3 配置了media
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') MEDIA_URL = '/media/'
# 4 配置了鏈接mysql
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'blog','USER': 'root','PASSWORD': '1234','HOST': '127.0.0.1','PORT': 3306} }
創建項目遷移表
1 用戶表 UserInfo---》擴寫auth的user表
2 博客表 Blog---》跟用戶表做一對一關聯
3 文章表 Article
4 文章分類表 ?Category
5 標簽表 ?Tag
6 點贊點踩表 ?UpAndDown
7 評論表 ?Commitmodels.py from django.db import models from django.contrib.auth.models import AbstractUserclass UserInfo(AbstractUser):# 擴寫字段---》手機號,頭像,phone = models.CharField(max_length=32)# /media/avatar/default.png# 必須安裝pillow 才能使用 ImageFieldavatar = models.ImageField(upload_to='avatar', default='avatar/default.png')blog = models.OneToOneField(to='Blog', on_delete=models.CASCADE, null=True)class Meta:verbose_name_plural = '用戶表' # 給其他人看,知道這是用戶表def __str__(self):return self.usernameclass Blog(models.Model):# 博客標題site_title = models.CharField(max_length=32)# 博客副標題site_name = models.CharField(max_length=32)# 博客樣式# 每個人樣式不同(文件地址)site_style = models.CharField(max_length=32)class Meta:verbose_name_plural = '博客表'def __str__(self):# 會報錯try:return self.userinfo.username + '---' + self.site_titleexcept Exception as e:return self.site_titleclass Tag(models.Model):name = models.CharField(max_length=32)blog = models.ForeignKey(to=Blog, on_delete=models.SET_NULL, null=True)class Meta:verbose_name_plural = '標簽表'def __str__(self):return self.nameclass Category(models.Model):name = models.CharField(max_length=32)blog = models.ForeignKey(to=Blog, on_delete=models.SET_NULL, null=True)class Meta:verbose_name_plural = '分類表'def __str__(self):return self.nameclass Article(models.Model):title = models.CharField(max_length=128)# 文章摘要desc = models.CharField(max_length=256, verbose_name='文章摘要')# 文章詳情 大文本content = models.TextField()create_time = models.DateTimeField(auto_now_add=True)# 關聯字段# 標簽和分類category = models.ForeignKey(to=Category, on_delete=models.SET_NULL, null=True)# 多對多,手動創建中間表tag = models.ManyToManyField(to=Tag, through='ArticleToTag', through_fields=('article', 'tag'))# 博客blog = models.ForeignKey(to=Blog, on_delete=models.CASCADE)class Meta:verbose_name_plural = '文章表'def __str__(self):return self.titleclass ArticleToTag(models.Model):article = models.ForeignKey(to=Article, on_delete=models.CASCADE)tag = models.ForeignKey(to=Tag, on_delete=models.CASCADE)class UpAndDown(models.Model):user = models.ForeignKey(to=UserInfo, on_delete=models.CASCADE)article = models.ForeignKey(to=Article, on_delete=models.CASCADE)is_up = models.BooleanField(default=True)create_time = models.DateTimeField(auto_now_add=True)class Meta:verbose_name_plural = '點贊點踩'def __str__(self):return self.is_upclass Commit(models.Model):user = models.ForeignKey(to=UserInfo, on_delete=models.CASCADE)article = models.ForeignKey(to=Article, on_delete=models.CASCADE)content = models.CharField(max_length=256)create_time = models.DateTimeField(auto_now_add=True)# 自關聯,評論層級---》子評論 一定要寫null=Trueparent_id = models.ForeignKey(to='self', on_delete=models.CASCADE, null=True)class Meta:verbose_name_plural = '評論表'def __str__(self):return self.content
# 自關聯:
注冊功能案例
完成注冊功能---高級一些使用form
?? ?-頭像實時顯示
? ? -注冊失敗錯誤信息展示
? ? -注冊成功跳轉到登錄頁面
測試三種緩存粒度
全站緩存:
1、緩存在文件中:
setting.py MIDDLEWARE = [ # 全棧,兩個中間鍵'django.middleware.cache.UpdateCacheMiddleware','django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware',# 'django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware','app01.middle_key.MyMiddlew','django.middleware.cache.FetchFromCacheMiddleware' ]CACHES = { # 存在文件中'default': {'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache', #指定緩存使用的引擎'LOCATION': 'D:\pythonproject\huancun_file', #指定緩存的路徑'OPTIONS':{'MAX_ENTRIES': 300, # 最大緩存記錄的數量(默認300)'CULL_FREQUENCY': 3, # 緩存到達最大個數之后,剔除緩存個數的比例,即:1/CULL_FREQUENCY(默認3)}} }
views.py # 全站緩存 from .models import Data def demo09(request):print('你好,周佳佳')data=Data.objects.all()return render(request,'shuju.html',{'data':data})
shuju.html <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/css/bootstrap.min.css" rel="stylesheet"><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/js/bootstrap.bundle.min.js"></script> </head> <body> <div class="row"><div class="col-md-6 col-md-offset-3"><div class="bd-example"><table class="table table-striped"><thead><tr><th>id</th><th>書名</th><th>價格</th><th>出版社</th></tr></thead><tbody>{% for book in data %}<tr><th scope="row">{{ book.id }}</th><td>{{ book.username }}</td><td>{{ book.email }}</td><td>{{ book.password }}</td></tr>{% endfor %}</tbody></table></div></div> </div> </body> </html>
2、緩存在內存中,看不見
CACHES = {'default': {'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',} }
視圖緩存:
views.py from .models import Data from django.views.decorators.cache import cache_page @cache_page(timeout=10) def demo09(request):print('你好,周佳佳')data=Data.objects.all()return render(request,'shuju.html',{'data':data})
局部緩存:
html <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>Title</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/css/bootstrap.min.css" rel="stylesheet"><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/js/bootstrap.bundle.min.js"></script> </head> {% load cache %} <body> <div class="row"><div class="col-md-6 col-md-offset-3"><div class="bd-example"><table class="table table-striped"><thead><tr><th>id</th><th>書名</th><th>價格</th><th>出版社</th></tr></thead><tbody>{% for book in data %}<tr><th scope="row">{{ book.id }}</th><td>{{ book.username }}</td><td>{{ book.email }}</td><td>{{ book.password }}</td></tr>{% endfor %}</tbody></table>{% cache 1 'name' %}<hr>{{ time }}{% endcache %}</div></div> </div> </body> </html>
views.py # 視圖緩存 from .models import Data import datetime def demo09(request):print('你好,周佳佳')data=Data.objects.all()return render(request,'shuju.html',{'data':data,'time':str(datetime.datetime.now())})
bootstrap5 的使用
使用bootstrap5 美化注冊頁面
下載 -Bootstrap中文網
# CSS引入<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/css/bootstrap.min.css" rel="stylesheet"><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/js/bootstrap.bundle.min.js"></script>