Django+Scrapy 小说网站初学者(二)

Django

一.创建项目

Django版本为4.1.6,
Python版本为3.10.2,
MySql 版本为8.0.33,
pycharm版本2023.2.

        1,使用pycharm创建虚拟环境以及Django项目

                1.1 使用命令创建Django项目

                        1、打开cmd,cd到指定的文件夹

                        2、输入:django-admin startproject 项目名

                 1.2 使用命令创建虚拟环境

                        1, 打开cmd,cd到指定的文件夹

                        2, virtualenv env   # env为虚拟环境名称   

                        3, cd env/bin/     

                        4, source activate   当路径前⾯出现了(env)代表激活成功

       

         2,创建Django app

                cd 到项目目录

python manage.py startapp index
python manage.py startapp ranking
python manage.py startapp read
python manage.py startapp search
python manage.py startapp user


        3,创建static文件夹/media文件夹

                1,static文件夹

                        1.1 css文件夹

                        1.2 image文件夹

                        1.3 js文件夹

                2,media文件夹

                        2.1 novel_img文件夹

        4,运行Django项目

        方法一: cmd 启动

                cd到Django跟目录下

python manage.py runserver
        方法二: pycharm启动

                pycharm直接启动 

小技巧:pycharm修改Django启动端口号,

                 菜单→运行→编辑配置→Django服务器→项目

二.setting设置

novel → setting.py

ALLOWED_HOSTS配置
  • 可以使用那些iP或者域名来访问系统
  • 默认为空,可以使用127.0.0.1或者localhost,也可以指定ip
  • 如果想允许任何ip进行访问,可以设置为*
    在项目下的settings.py中设置允许任何ip访问
DEBUG = True

ALLOWED_HOSTS = ['*']
注册app

        创建的app需要在settings.py配置⽂件添加 

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'index',
    'ranking',
    'read',
    'search',
    'user',
]
TEMPLATES  静待文件配置
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [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',
            ],
        },
    },
]
数据库配置
        项⽬的数据存储采⽤MySQL数据库,我们在MySQL中创建数据库music_db,并在配置属性
DATABASES中设置MySQL的链接⽅式。
配置代码如下:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'novel_db',
        'USER': 'root',
        'PASSWORD': '123456',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}
时区语⾔配置: 
# 语言
LANGUAGE_CODE = 'zh-Hans'

# 时区
TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True
# 上传数据库使用的时间为全世界/False为采用本地时间
USE_TZ = False
静态资源路径配置:
        将静态资源⽂件夹static和媒体资源⽂件夹media引⼊Django的运⾏环境,同时将Django内置⽤⼾模 型User改为项⽬应⽤user的⾃定义模型MyUser,配置代码如下:

# 配置自定义用户表MyUser
AUTH_USER_MODEL = 'user.MyUser'  # AUTH_USER_MODEL

# 静态资源文件路径
STATIC_URL = '/static/'
if DEBUG:
    STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
else:
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')

# 媒体资源的保存路径
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
MEDIAFILES_DIRS = [BASE_DIR / 'media']

三.定义models

1.数据表定义

小说表 Novel
  1. 书名 book_name

  2. 作者 author_name

  3. 更新时间 update_time

  4. 简介 intro

  5. 图片(路径) image_url

  6. 是否完结 state

  7. 类型 关联 →类型表 novel_type

章节表 Chapter
  1. 序号 chapter_number

  2. 章节 chapter

  3. 内容 chapter_content

  4. 书名 关联 → 小说表 book_name

类型表 NovelTypes
  1. 类型 type

动态表 Reading
  1. 阅读量 reading

  2. 搜索量 search

  3. 书名 关联 → 小说表 book_name

书架表 Bookshelf
  1. 书名 关联→小说表 book_name

  2. 账号 关联→账号表 user

账号表 MyUser
  1. 手机号 mobile

  2. 昵称 nickname

index  →  models.py

from django.db import models
from user.models import MyUser


class NovelTypes(models.Model):
    type = models.CharField('小说类型', max_length=50)

    def __str__(self):
        return self.type

    class Meta:
        verbose_name = '小说类型'
        verbose_name_plural = verbose_name


class Novel(models.Model):
    book_name = models.CharField('书名', max_length=500)
    author_name = models.CharField('作者', max_length=500)
    update_time = models.CharField('更新时间', max_length=500)
    intro = models.CharField('简介', max_length=2000)
    image_url = models.FileField('小说封面', max_length=300)

    # 在Django当中的约束
    state_choice = (
        (1, '已完结'),
        (2, '连载中...')
    )
    state = models.SmallIntegerField('状态', choices=state_choice)
    novel_type = models.ForeignKey(NovelTypes, on_delete=models.CASCADE, verbose_name='小说类型')

    def __str__(self):
        return self.book_name

    class Meta:
        verbose_name = '小说信息'
        verbose_name_plural = verbose_name


class Chapter(models.Model):
    chapter_number = models.CharField('序号', max_length=100)
    chapter = models.CharField('章节', max_length=500)
    chapter_content = models.TextField('章节内容', max_length=10000)
    book_name = models.ForeignKey(Novel, on_delete=models.CASCADE, verbose_name='书名')

    def __str__(self):
        return self.chapter

    class Meta:
        verbose_name = '小说章节'
        verbose_name_plural = verbose_name


class Reading(models.Model):
    reading = models.IntegerField('阅读次数', default=0)
    search = models.IntegerField('搜索次数', default=0)
    book_name = models.ForeignKey(Novel, on_delete=models.CASCADE, verbose_name='书名')

    def __str__(self):
        return self.book_name

    class Meta:
        verbose_name = '小说动态'
        verbose_name_plural = verbose_name


class Bookshelf(models.Model):
    book_name = models.ForeignKey(Novel, on_delete=models.CASCADE, verbose_name='书名')
    user = models.ForeignKey(MyUser, on_delete=models.CASCADE, verbose_name='用户')

    def __str__(self):
        return self.book_name

    class Meta:
        verbose_name = '我的书架'
        verbose_name_plural = verbose_name

user → models.py  

        ⽤户表由Django内置模型User扩展而成
from django.db import models
from django.contrib.auth.models import AbstractUser


class MyUser(AbstractUser):
    nickname = models.CharField('昵称', max_length=20)
    mobile = models.CharField('手机号', max_length=11, unique=True)

    def __str__(self):
        return self.nickname

2.数据库迁移

        方法一:pycharm 直接迁移

                菜单→工具→运行manage.py任务...(Ctrl+Alt+R)

        1.执行启动迁移  生成迁移文件 :makemigrations

        2.执行迁移提交到数据库 :  migrate

        方法二:cmd 执行

                cd 到项目根目录

        1.python manage.py makemigrations     # 创建数据结构

        2.python manage.py migrate     # 迁移结构

                

四.配置URLs

1,novel → urls.py

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
                  path('admin/', admin.site.urls),  # django admin后台管理
                  path('', include('index.urls')),  # 首页
                  path('ranking/', include('ranking.urls')),  # 排行
                  path('read/', include('read.urls')),  # 阅读
                  path('search/', include('search.urls')),  # 搜索
                  path('user/', include('user.urls')),  # 账号

              ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
# 用于返回在调试模式下服务文件的 URL 模式的辅助函数
# static 让我们可以正常访问媒体路径

2,index→ urls.py

from django.urls import path
from .views import *

app_name = 'index'
urlpatterns = [
    path('', index_views, name='index_views')
]

3,ranking →urls.py

from django.urls import path
from .views import *

app_name = 'ranking'
urlpatterns = [
    path('<int:type_id>/<int:page>/', ranking_views, name='ranking_views'),
    path('<int:type_id>/', ranking_default, name='ranking_default')
]

4,read→urls.py

from django.urls import path
from .views import *

app_name = 'read'
urlpatterns = [
    path('<int:novel_id>/', read_list_views, name='read_list_views'),
    path('<int:novel_id>/<int:chapter_number>/', read_views, name='read_views'),
]

5,search→urls.py

from django.urls import path
from .views import *

app_name = 'search'
urlpatterns = [
    path('<int:page>/', search_views, name='search_views'),
    path('', search_default, name='search_default'),
]

6,user→urls.py

from django.urls import path
from .views import *

app_name = 'user'
urlpatterns = [
    path('register/', register_views, name='register_views'),
    path('login/', login_views, name='login_views'),
    path('home/', home_views, name='home_views'),
    path('logout/', logout_views, name='logout_views'),
    path('bookshelf/<int:novel_id>/', bookshelf_views, name='bookshelf_views'),
]

五,admin后台管理

user→admin.py

from django.contrib import admin
from index.models import *
from user.models import MyUser

admin.site.register([NovelTypes, Novel, Chapter, Reading, MyUser, Bookshelf])

admin后台管理    超级用户

python manage.py createsuperuser

依次输入用户名(12345678)、邮箱(12345678@qq.com)、密码(00000000) 创建后在网址输入账号密码:http://127.0.0.1:8000/admin/

  • 31
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值