django2.2 简单博客 一

多用户博客项目,全栈项目之一,数据库模型设计,BS架构实现。篇一主要是后端开发部分。尚未修改好,先凑合看着,会有些啰嗦,我会慢慢修改,谢谢
摘要由CSDN通过智能技术生成

博客项目

无论进行什么项目,首先进行需求分析。

需求分析

要建立最初始需求文档,每个功能要一个一个梳理,建立一个个功能点,清晰,然后需要客户过目,事后要放入项目归档。项目管理很关键。但是客户往往是跳跃性的想法,我们需要不断的沟通交流才能设计好的服务。
需求理清后第一件事就是建表,改setting配置(因为这个在启动时就加载,如果启动后修改可能不会刷新。)

我们可以通过快速迭代,不断的更新版本以寻求怎样的功能能提高市场占有率。

千万不要过度设计。

要设计窗口吗?
不需要,只要借助浏览器。
选型,调查一下。基本上都是用BS,虽然也有一些问题,兼容性问题,就是不能用IE。

最重要的是博文和用户,即用户管理,博文管理。

数据库选择
CMDB配置管理数据库( Configuration Management Database,CMDB)是一个逻辑数据库,包含了配置项全生命周期的信息以及配置项之间的关系(包括物理关系、实时通信关系、非实时通信关系和依赖关系)。

MIS管理信息系统(管理信息系统–Management Information System),主要指的是进行日常事务操作的系统。这种系统主要用于管理需要的记录,并对记录数据进行相关处理,将处理的信息及时反映给管理者的一套网络管理系统。

使用Mysql 8.0 InnoDB引擎(增删改查功能)。

流程化,流程系统更加麻烦。

先确定数据的表格,设立外键时类型和大小要一致。
先建立user表,sql语句如下

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(48) NOT NULL,
  `email` varchar(64) NOT NULL,
  `password` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'MD5加密\r\n',
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

含有id 唯一标识 主键
,name 用户名,描述性字段
,email 用户电子邮箱
,password 用户密码,不能明文储存,采用单向加密,如MD5(缺点,可以反查,计算速度过快,穷举太快)

建立一个文章的post表

CREATE TABLE `post` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(128) NOT NULL,
  `pubdata` datetime(6) NOT NULL,
  `author_id` int(11) NOT NULL,
  `content` text NOT NULL,
  PRIMARY KEY (`id`),
  KEY `author_id` (`author_id`),
  CONSTRAINT `post_ibfk_1` FOREIGN KEY (`author_id`) REFERENCES `user` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

含有id 唯一标识
,title 标题,描述性字段
,pubdata 发布日期,日期类型
,author_id,博文作者id,外键,必须是table user的id(外键可以不写,在逻辑层面做到也可以)

作者和用户id需要有一个关系,在创建文章时,auther_id必须存在于user(id)中,如果不存在则会抛异常。如果要删除post表中的内容,则可以直接删除,如果要删除user表中的内容,则需要设定级联删除ON DELETE CASCADE 级联删除 ON UPDATE CASCADE 级联更新,但一般不用这个。我们更希望在逻辑层面上删除,通过事务控制更好。
当然post表最重要的,content,类型是选择text(大约有6万多个字符),或者longtext(考虑使用,有必要吗?)。这是一个大字段,在应用时一般会再建立一张表单独放开,一般查询的时候不会用到这个大字段,频繁查询的字段放在post表中,这两张表也有联系,一一对应关系,post生成一个id后,content表才可以使用这个id,使用事务解决(但是如果被打断了怎么办,这是风险。)。同一个用户的附加信息要放在外面,即必填表和非必填项,事务控制在创建用户时一起添加这些信息,insert into,也可以用外键约束。

博客的数据库系统显然是一对多的关系,一个作者有多个博文。
content的选取?选取大小?图片如何处理?单独放一张表。
博文一般在几万字内,因此需要很大,选择text很合适,甚至longtext。
图片储存,博文就像HTML一样,图片通过路径信息将图片嵌入在内容中的,所以保存的内容还是字符串。
来源有两种:外链,通过URL链接访问,本站不用存储图片,但是容易引起盗链问题。
本站存储,需要提供博文的文本编辑器,提供图片上传到网站存储,并生成图片URL,这个URL嵌入到博客正文中。这个要解决图片存储的问题,水印问题,临时图片清理,在线压缩问题等等。使用磁盘阵列,云,分布式文件系统等,运维相关,术语要懂。

content不应该和频繁查询的字段放在同一张表中,应该单独放一张表。

CREATE TABLE `content` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `content` text NOT NULL,
  `post_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `post_id` (`post_id`),
  CONSTRAINT `content_ibfk_1` FOREIGN KEY (`post_id`) REFERENCES `post` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这里生产的SQL脚本不用来生成表,使用ORM工具来创建表,用来检查实体类构建是否正确。

在pycharm中新建一个项目,下面开始django之路。

使用pycharm创建一个项目后,在文件路径下的view,terminal输入pip list 里面两个包就是虚拟环境必须的包。pip和setuptools。
然后在settings中Project:name中的project interpreter,python解释器中,可以更改你用的python版本,安装的包等。
项目要用的包一定要有,不用的包绝对不要出现,

先完成核心业务
满足用户,注册登录登出,user表
博客的发文文章列表,文章详情,post和content表

多人博客项目
BS开发的Django;
Django采用MVC架构设计的开源的WEB快速开发框架。
优点:
快速开发,(Auth,Cache,模板,并不推荐使用)。
MVC设计模式
实用的管理后台(实际的后台管理是管理业务问题,Flask框架简单轻巧)
自带ORM,Template,Form,Auth核心(管理模块,有些能去除)
组件
简介的URL设计(不支持post,get)
插件丰富(大多数不是原生的)

缺点:
太大,东西全而大
同步阻塞!

这就是为什么很多人用tomado(基于协程的异步模型,效率高),大多数情况下用Django就够了,但是做网站光用django肯定是不行的,Django是动态网页服务,一定要做动静分离,做优化,动态用动态服务器,静态用静态服务器,效率更高(企业级应用)。
模板就是替换字符串,模板Jinja做不到前后端分离。后端只负责Json数据,传到前端后,靠JS静态加载数据,之间靠定义接口耦合,对http开放的API接口,restful风格。

Django版本使用1.11,可以支持2.7,-3.6的python版本。2.0以上的不在支持python2.7了。python2.7可以提供很多插件,也可以自己写,熟系框架后。

作为一个Python web框架,django需要安装python。

Django版本 Python版本
1.11 2.7,3.4,3.5,3.6,3.7(在1.11.17中添加)
2.0 3.4,3.5,3.6,3.7
2.1,2.2 3.5,3.6,3.7

windows安装Django很简单:直接pip install Django即可安装最新的正式版Django。在创建的新项目中的terminal下输入即可。
安装完后,先简单了解一下Django,在如图所示的库文件里可以看到:
Django
django-admin。我们看看都有哪些命令:

Type 'django-admin help <subcommand>' for help on a specific subcommand.
Available subcommands:
[django]
    check
    compilemessages
    createcachetable
    dbshell
    diffsettings
    dumpdata
    flush
    inspectdb
    loaddata
    makemessages
    makemigrations
    migrate
    runserver
    sendtestemail
    shell
    showmigrations
    sqlflush
    sqlmigrate
    sqlsequencereset
    squashmigrations
    startapp
    startproject
    test
    testserver
Note that only Django core commands are listed as settings are not properly configured (error: Requested setting INSTALLED_APPS, but settings are not configured. You must either define the environment variable DJANGO_SET
TINGS_MODULE or call settings.configure() before accessing settings.).

注意:这些命令都是在开发环境下才可以用即:
env
最常用的就是startproject,查看一下help:django-admin help startproject

usage: django-admin startproject [-h] [--template TEMPLATE]
                                 [--extension EXTENSIONS] [--name FILES]
                                 [--version] [-v {0,1,2,3}]
                                 [--settings SETTINGS]
                                 [--pythonpath PYTHONPATH] [--traceback]
                                 [--no-color] [--force-color]
                                 name [directory]

Creates a Django project directory structure for the given project name in the
current directory or optionally in the given directory.

positional arguments:
  name                  Name of the application or project.
  directory             Optional destination directory

optional arguments:
  -h, --help            show this help message and exit
  --template TEMPLATE   The path or URL to load the template from.
  --extension EXTENSIONS, -e EXTENSIONS
                        The file extension(s) to render (default: "py").
                        Separate multiple extensions with commas, or use -e
                        multiple times.
  --name FILES, -n FILES
                        The file name(s) to render. Separate multiple file
                        names with commas, or use -n multiple times.
  --version             show program's version number and exit
  -v {0,1,2,3}, --verbosity {0,1,2,3}
                        Verbosity level; 0=minimal output, 1=normal output,
                        2=verbose output, 3=very verbose output
  --settings SETTINGS   The Python path to a settings module, e.g.
                        "myproject.settings.main". If this isn't provided, the
                        DJANGO_SETTINGS_MODULE environment variable will be
                        used.
  --pythonpath PYTHONPATH
                        A directory to add to the Python path, e.g.
                        "/home/djangoprojects/myproject".
  --traceback           Raise on CommandError exceptions
  --no-color            Don't colorize the command output.
  --force-color         Force colorization of the command output.

django-admin startproject blog . 在项目里创建Django项目,"."表示在本根目录下,不会另外创建目录,直接将当前目录作为项目目录。结构如下:
在这里插入图片描述
manage.py在这里我们创建的所有子命令都归这里管,项目管理的命令行工具。应用创建、数据库迁移等都用它完成。
blog中init目前没什么用;settings,全局配置的,文件不能少;URL做路由用,路径映射配置,默认情况下只配置/admin的路由;WSGI不用多说,就是WSGI协议。Django就是更加丰富的基于WSGI的框架。

先来看看settings:全局配置,数据库参数。(!!!注意配置文件千万别删除,即使修改也要注释掉原有的配置)

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

__file__指的是当前的.py文件路径是什么,abspath,它的绝对路径是什么,dirname(os.path.abspath(file))绝对路径所对应的目录是什么,之后再一个dirname,指的是再上一级目录,全局量,项目根目录。作为一个基路径,供其他对象使用。例如(该文件下的):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

将数据库文件sqlite加入进项目根目录。但我们这里用自己的数据库。

ALLOWED_HOSTS = [] # 允许的主机

INSTALLED_APPS = [  # 安装的app,我们自己app也可以加进来
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

MIDDLEWARE = [  # 中间件,类似于拦截器
    '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',
]

ROOT_URLCONF = 'blog.urls'  # 所有的URL配置从哪里开始,就是简单的多级路由,在blog包下的urls开始,最后靠动态加载。

TEMPLATES = [  # 模板配置
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],  # 模板在哪里
        'APP_DIRS': True,
        'OPTI
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值