settings頁面設置mysql
import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) SECRET_KEY = '%^klc2c5$z033pu(pbydgk$+=58w7j2$!1@5ff(z(y2jg^s+9a' # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = [] # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config', # 你的項目應用位置位置,版本問題有的沒加你直接加上你的應用名稱便可 ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', # 安全組件 你在後面的提交中必須使用csrf_token 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', # 這裏存放你本身的中間件 ] ROOT_URLCONF = 'BBS.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR, 'templates')], # 版本問題有可能須要手動配置 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'BBS.wsgi.application' # Database # https://docs.djangoproject.com/en/2.0/ref/settings/#databases # 使用mysql的配置 不改默認的直接使用sqlite DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'blog_ebola', # 數據庫名稱 'USER': 'ebola', # 用戶名 'PASSWORD': '2017@ebolaer', # 密碼 'POST': 3306, # 端口 'HOST': '140.143.228.216' } } # Password validation # https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True # 在博客園的按時間分類中沒法解決把他改成false就能夠 # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.0/howto/static-files/ STATIC_URL = '/static/' #不配置static路徑了由於static文件夾放在了app中不須要配置 AUTH_USER_MODEL = "app01.UserInfo" # 主要是配合模塊不使用本身建立的user數據表 # logging模塊 BASE_LOG_DIR = os.path.join(BASE_DIR, 'log') # 建立一個log文件夾,配置路徑 LOGGING = { 'version': 1, # 系統與預留字 'disable_existing_loggers': False, # 禁用django模塊中已經存在的log實例 # 格式化輸出 'formatters': { 'standard': { 'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' '[%(levelname)s][%(message)s]' }, 'simple': { 'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s' }, 'collect': { 'format': '%(message)s' } }, # 過濾器 'filters': { 'require_debug_true': { '()': 'django.utils.log.RequireDebugTrue', }, }, # 處理器 'handlers': { 'console': { 'level': 'DEBUG', 'filters': ['require_debug_true'], # 只有在Django debug爲True時纔在屏幕打印日誌 ,通常上線會把級別調高或者改成flase 這樣就很好地避免了一行行刪代碼 'class': 'logging.StreamHandler', # 這個是在屏幕顯示 'formatter': 'simple' # 按照上面配置的simple方法進行輸出 }, 'default': { 'level': 'INFO', 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自動切 'filename': os.path.join(BASE_LOG_DIR, "bbs_info.log"), # 日誌文件 'maxBytes': 1024 * 1024 * 50, # 日誌大小 50M 'backupCount': 3, # 最大備份數量 'formatter': 'standard', # 格式化輸出,按照standard方式(在上面配置的格式)輸出 'encoding': 'utf-8', # 編碼方式若是不指定就是系統環境編碼 千萬注意你永遠不知道那幫運維會搞出什麼編碼方式!!!! }, 'error': { 'level': 'ERROR', 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自動切 'filename': os.path.join(BASE_LOG_DIR, "bbs_err.log"), # 日誌文件 'maxBytes': 1024 * 1024 * 50, # 日誌大小 50M 'backupCount': 5, 'formatter': 'standard', 'encoding': 'utf-8', }, 'collect': { 'level': 'INFO', 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自動切 'filename': os.path.join(BASE_LOG_DIR, "bbs_collect.log"), 'maxBytes': 1024 * 1024 * 50, # 日誌大小 50M 'backupCount': 5, 'formatter': 'collect', 'encoding': "utf-8" } }, 'loggers': { # 默認的logger應用以下配置 '': { 'handlers': ['default', 'console', 'error'], # 上線以後能夠把'console'移除,若是一處列表中的console那麼就不會顯示 只顯示列表中有的級別 'level': 'DEBUG', 'propagate': True, }, # 名爲 'collect'的logger還單獨處理,這個的存在主要做用於用戶我的數據、瀏覽器習慣等收集 'collect': { 'handlers': ['console', 'collect'], 'level': 'INFO', }, # 查看sql中的執行語句 'django.db.backends': { 'handlers': ['console'], 'level': 'INFO', }, }, } # MEDIA配置 對外開放接口 MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'app01', 'media')
①開放圖片訪問的藉口media url中配置sql
②不使用auth中默認的user表而是用本身userinfo表 數據庫
urls中配置的圖片開放接口以及分級路由django
from django.contrib import admin from django.conf.urls import url,include from app01.views import * # 如下爲開放頭像藉口 from django.views.static import serve from BBS import settings from app01.urls import * urlpatterns = [ url('admin/', admin.site.urls), # 註銷\登陸\修改密碼\註冊 url(r'^login/', Login.as_view(), name='login'), url(r'^loginout/', LoginOut.as_view(), name='loginout'), url(r'^reg/', Reg.as_view(), name='reg'), # 主頁 url(r'^index/', Index.as_view(), name='index'), # 我的站點 url(r'blog/', include("app01.urls")), # 頭像接口、驗證碼圖片 url(r'^media/(?P<path>.*)$',serve,{'document_root':settings.MEDIA_ROOT}), url(r'^get_valid_img/', GetValidImg.as_view(), name='get_valid_img'), # url(r'background/(?P<username>\w+)/(?P<cate>\w+)', BackGround.as_view()), url(r'background/article/(?P<func>\w+)/(?P<article_id>\d*)',BackGround.as_view()), ]
models模塊表關係瀏覽器
from django.contrib.auth.models import AbstractUser from django.db import models class UserInfo(AbstractUser): """ 用戶信息 """ nid = models.AutoField(primary_key=True) telephone = models.CharField(max_length=11, null=True, unique=True) avatar = models.FileField(upload_to='avatars/', default="/avatars/default.png") create_time = models.DateTimeField(verbose_name='建立時間', auto_now_add=True) blog = models.OneToOneField(to='Blog', to_field='nid', null=True) 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 = models.CharField(verbose_name='我的博客後綴', max_length=32, unique=True) 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') 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') 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) category = models.ForeignKey(to='Category', to_field='nid', null=True) user = models.ForeignKey(verbose_name='做者', to='UserInfo', to_field='nid') comment_count = models.IntegerField(default=0) up_count = models.IntegerField(default=0) down_count = models.IntegerField(default=0) tags = models.ManyToManyField( to="Tag", through='Article2Tag', through_fields=('article', 'tag'), ) def __str__(self): return self.title class ArticleDetail(models.Model): """ 文章詳細表 """ nid = models.AutoField(primary_key=True) content = models.TextField() article = models.OneToOneField(to='Article', to_field='nid') class Article2Tag(models.Model): nid = models.AutoField(primary_key=True) article = models.ForeignKey(verbose_name='文章', to="Article", to_field='nid') tag = models.ForeignKey(verbose_name='標籤', to="Tag", to_field='nid') 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) article = models.ForeignKey("Article", null=True) is_up = models.BooleanField(default=True) class Meta: unique_together = [ ('article', 'user'), ] class Comment(models.Model): """ 評論表 """ nid = models.AutoField(primary_key=True) article = models.ForeignKey(verbose_name='評論文章', to='Article', to_field='nid') user = models.ForeignKey(verbose_name='評論者', to='UserInfo', to_field='nid') content = models.CharField(verbose_name='評論內容', max_length=255) create_time = models.DateTimeField(verbose_name='建立時間', auto_now_add=True) parent_comment = models.ForeignKey('self', null=True) def __str__(self): return self.content
①中間的models.FileField字段,裏面存放圖片avatar = models.FileField(upload_to='avatars/', default="/avatars/default.png") 安全
一、登陸頁面網絡
全屏背景設置樣式session
body { background-image: url(http://imgcdn.ph.126.net/UQhSl0NAkp9wsn0keF-rLA==/3084402794814350820.jpg); #這裏能夠放網絡地址也能夠放本地圖片 直接存放本地路徑也能夠不加冒號 background-position: center; background-repeat: no-repeat; background-attachment: fixed; }
auth驗證app
驗證碼生成及驗證運維
二、註冊頁面
滑動模塊應用
三、登陸裝飾器
next跳轉問題
裝飾器函數問題