項目流程:python
一、搞清楚需求(產品經理)mysql
(1)基於用戶認證組件和Ajax實現登陸驗證(圖片驗證碼)web
(2)基於form組件和Ajax實現註冊登陸sql
(3)設計系統首頁(文章列表渲染)數據庫
(4)設計我的站點頁面django
(5)文章詳情頁cookie
(6)實現文章點贊功能session
(7)實現文章評論;文章的評論、評論的評論xss
(8)富文本編輯框和基於bs4模塊防護xss攻擊測試
二、設計表結構
三、按着每一個功能進行開發
四、功能測試
五、項目部署上線
登陸註冊, 註冊用戶,過濾驗證--->一張用戶表就能夠。想描述這我的登陸了怎麼樣,沒有登陸怎麼樣,就用到了cookie和session---->用戶認證組件;
用戶認證組件的大前提是必需要用django自帶的那個auth_user表,若是那些字段不夠用怎麼辦?本身寫一個UserInfo表,去繼承AbstractUser這個類,AbstractUser裏邊有username、passowrd等auth_user裏邊的字段,進行數據庫遷移的時候就生成了UserInfo這一張表,就不會再單獨生成auth_user那張表了,UserInfo裏邊已經有它全部字段。
咱們以前用用戶認證組件用的是auth_user表,如今就能夠直接用UserInfo這個表了,由於User也是繼承的AbstractUser,如今不繼承了UserInfo直接去繼承。
UserInfo表裏邊應該還有title、site_name、theme字段,爲了解耦把它放在Blog表裏邊,而後經過一對一關係去鏈接索取。
UserInfo表和Blog表是一對一,UserInfo表和Blog、Category是一對多關係。只須要綁定一個一對多就能夠了,另一個經過跨表查詢去查找。 Category表跟Blog綁定關係或者跟UserInfo綁定關係均可以,這裏Category與Blog綁定了一對多的關係。如查詢mm建立了多少個分類,經過mm找到站點Blog對象,站點Blog對象跟分類表Category綁定一對多的關係,經過站點Blog對象就能查出全部的分類表的字段了,也就是用戶的分類對象了。
Tag和Category表是同樣的,一個站點Blog能夠有多個標籤Tag,一個標籤Tag只能屬於一個站點Blog。
文章Article與分類Category,一個分類能夠有多篇文章,一篇文章可否有多個分類?(能夠設計成只有一個分類也能夠設計成有多個分類)這裏咱們設計成了一篇文章只能有一個分類,(Tag標籤和文章已是多對多的關係了)。Article跟Category綁定了一對多的關係,同時跟Tag表綁定了多對多的關係,這裏用到一箇中介模型的概念,不用它去建立第三張表了,咱們本身手動寫第三張表。 文章Article與用戶UserInfo是一對多的關係。
點贊表,哪個用戶user(去關聯用戶表)對哪一篇文章article(去關聯文章表)點讚了True或者踩滅False。
評論表Comment
哪個用戶對哪一篇文章在哪一個時間作了什麼評論 ,涉及這4個字段
要知道這些跟、子評論的父子關係,存的時候要把它描述出來,再加一個parent_comment_id字段
跟評論:對文章的評論;111 222 333 子評論:對評論的評論;444 555 Comment nid user_id article_id content parent_comment_id(null=True) 1 1 1 111 null 2 2 1 222 null 3 3 1 333 null 4 4 1 444 1 5 5 1 555 4
# -*- encoding:utf-8 -*- from django.db import models # Create your models here. from django.contrib.auth.models import User, AbstractUser class UserInfo(AbstractUser): # 使用用戶認證組件須要使用auth_user表,擴展這個表須要繼承AbstractUser,User繼承的就是AbstractUser """ 用戶信息 用戶信息表和博客信息表是一對一的關係 """ nid = models.AutoField(primary_key=True) telephone = models.CharField(max_length=11, null=True, unique=True) avatar = models.FileField(upload_to='avators/', default="/avatars/default.png") # 存本地用戶圖像字段 create_time = models.DateTimeField(verbose_name='建立時間', auto_now_add=True) # auto_now_add:默認當前時間 blog = models.OneToOneField(to='Blog', to_field='nid', null=True, on_delete=models.CASCADE) def __str__(self): return self.username class Blog(models.Model): """ 博客信息表 (站點表) """ nid = models.AutoField(primary_key=True) title = models.CharField(verbose_name='我的博客標題', max_length=64) site_name = models.CharField(verbose_name='站點名稱', max_length=64) theme = models.CharField(verbose_name='博客主題', max_length=32) def __str__(self): return self.title class Category(models.Model): """ 博主我的文章分類表 博客信息表和分類表是一對多的關係,用戶表和分類表也是一對多的關係,由於用戶表和博客信息表是一對一的關係, 能夠找到分類表,因此不須要在寫用戶表和分類表的映射關係 """ nid = models.AutoField(primary_key=True) title = models.CharField(verbose_name='分類標題', max_length=32) blog = models.ForeignKey(verbose_name='所屬博客', to='Blog', to_field='nid', on_delete=models.CASCADE) def __str__(self): return self.title class Tag(models.Model): """ 博主我的文章標籤表 和分類表相似 """ nid = models.AutoField(primary_key=True) title = models.CharField(verbose_name='標籤名稱', max_length=32) blog = models.ForeignKey(verbose_name='所屬博客', to='Blog', to_field='nid', on_delete=models.CASCADE) def __str__(self): return self.title class Article(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField(max_length=50, verbose_name='文章標題') desc = models.CharField(max_length=255, verbose_name='文章描述') create_time = models.DateTimeField(verbose_name='建立時間', auto_now_add=True) comment_count = models.IntegerField(default=0) up_count = models.IntegerField(default=0) down_count = models.IntegerField(default=0) user = models.ForeignKey(verbose_name='做者', to='UserInfo', to_field='nid', on_delete=models.CASCADE) category = models.ForeignKey(to='Category', to_field='nid', null=True, on_delete=models.CASCADE) tags = models.ManyToManyField( # 用了一箇中介模型,建立第三張表 to="Tag", through='Article2Tag', through_fields=('article', 'tag'), ) def __str__(self): return self.title class Article2Tag(models.Model): nid = models.AutoField(primary_key=True) article = models.ForeignKey(verbose_name='文章', to="Article", to_field="nid", on_delete=models.CASCADE) tag = models.ForeignKey(verbose_name='標籤', to="Tag", to_field="nid", on_delete=models.CASCADE) # 聯合惟一,這兩個字段不能重複 class Meta: unique_together = [ ('article', 'tag'), ] def __str__(self): v = self.article.title + "---" + self.tag.title return v class ArticleUpDown(models.Model): """ 點贊表 哪一個人對哪篇文章點贊或踩 """ nid = models.AutoField(primary_key=True) user = models.ForeignKey('UserInfo', null=True, on_delete=models.CASCADE) article = models.ForeignKey('Article', null=True, on_delete=models.CASCADE) is_up = models.BooleanField(default=True) class Meta: unique_together = [ ('article', 'user'), ] class Comment(models.Model): """ 評論表 根評論:對文章的評論(哪一個人對哪一個文章在哪一個時間作了什麼評論) 子評論:對評論的評論 """ nid = models.AutoField(primary_key=True) user = models.ForeignKey(verbose_name='評論者', to='UserInfo', to_field='nid', on_delete=models.CASCADE) article = models.ForeignKey(verbose_name='評論文章', to='Article', to_field='nid', on_delete=models.CASCADE) create_time = models.DateTimeField(verbose_name='建立時間', auto_now_add=True) content = models.CharField(verbose_name='評論內容', max_length=255) parent_comment = models.ForeignKey('self', null=True, on_delete=models.CASCADE) # 本身關聯本身,自關聯,能夠寫成self,也能夠寫成Commen def __str__(self): return self.content ''' 111 ` 444 555 222 333 Comment nid user_id article_id content parent_comment_id(null=True) 1 1 1 111 null 2 2 1 222 null 3 3 1 333 null 4 4 1 444 1 5 5 1 555 4 '''
查詢一篇文章的評論數--->拿到文章對象必須跨表找到與它關聯的全部的評論對象,數下有多少條。涉及跨表查詢,效率很是低。咱們引入了3個字段,其中有一個comment_content(文章的評論數),爲了查詢文章評論數的時候沒必要每次都跨表去查詢,加一個文章評論數的字段。 -->之後每生成一個評論的時候把這個文章找到,把它的comm_content作一個自加1的操做,生成一個評論作一個自加1。 之後文章有多少個評論數,到這個字段裏邊去取就能夠,不用跨表了。每生成一個評論找到它關聯的文章作自加1,這個時候也跨表了,多作這一步屬於添加的時候慢一點。對於web訪問查詢的操做要多多與添加。
點贊也是同樣的,加一個點贊字段,每生成一個點讚的時候找到這篇文章給它自加1就能夠了
改爲用mysql
DATABASES = { 'default':{ 'ENGINE':'django.db.backends.mysql', 'NAME':'cnblog',#要鏈接的數據庫,鏈接前需建立好 'USER':'root',#鏈接數據庫的用戶名 'PASSWORD':'',#鏈接數據庫的密碼 'HOST':'127.0.0.1',#鏈接本機,默認本機 'PORT':'3306' #端口,默認3306 } }
#要想繼承AbstractUser,應該在settings裏邊寫入這個 AUTH_USER_MODEL = "blog.UserInfo"
應該先在mysql裏邊建立cnblog這個數據庫再進行數據庫遷移建立
mysql> create database cnblog;
Query OK, 1 row affected (0.22 sec)
進行數據庫遷移
python manage.py makemigrations
python manage.py migrate
django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
Did you install mysqlclient?
若是提示你這個就 pip install mysqlclient下