BBS項目

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')
setting設置解析

  ①開放圖片訪問的藉口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()),
]
url分級路由以及頭像藉口驗證碼

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跳轉問題

  裝飾器函數問題

相關文章
相關標籤/搜索