1、环境及简介
前端开发:HTML、CSS、JavaScript
后端开发:Java、PHP、Python、GO
数据库:MySQL、MSSQL、Oracle、Redis
安装Django
pip install Django 或 下载.whl后 pip install D:\xxx.whl
创建Django项目
File--New Project--Django 或 命令django-admin startproject MyDjango
* manage.py 命令行工具 python manage.py help 帮助命令
* init.py 初始化文件,一般无须修改
* asgi.py 启动异步通信服务,如在线聊天等异步通信功能
* settings.py 项目配置文件
* urls.py 项目路由设置,设置网站的具体网址内容
* wsgi.py Python Web Server Gateway Interface Python服务器网关接口,用于Django项目在服务器上的部署和上线
查看Django版本
python import django django.version
创建项目应用,简称App,相当于网站功能
python manage.py startapp index
* migrations 生成数据迁移文件,自动在数据库中生成相应的数据表
* init.py 当前App名的初始化文件
* admin.py 设置当前App的后台管理功能
* apps.py 当前App的配置信息
* models.py 数据库的映射类,每个类关联一张数据表,实现数据的持久化,即MTV的模型
Model
* tests.py 自动化测试的模块,实现单元测试
* views.py 试图文件,处理功能的业务逻辑,即MTV中的视图View
启动项目
python manage.py runserver 8001 http://127.0.0.1:8001/
2、项目需求与设计
软件工程
- 开发流程:需求分析→设计说明(概要和详细设计)→代码编写→程序测试→软件交付→客户验收→后期维护。
- 网站首页:商品搜索功能、网站导航、广告轮播、商品分类热销、网站尾部
- 商品列表页:商品搜索功能、网站导航、商品分类、商品列表
- 商品详细页:商品搜索功能、网站导航、商品基本信息、商品详细介绍、热销推荐
- 购物车页面:商品搜索功能、网站导航、商品的购买费用核算
- 个人中心页面:商品搜索功能、网站导航、用户基本信息、订单信息
- 用户登录注册页面:商品搜索功能、网站导航、登录注册表单
数据库表的数据结构
商品信息表
|---------------|------------|------|
| id | Int11 | 主键 |
| name | Varchar100 | 商品名称 |
| sizes | Varchar100 | 商品规格 |
| types | Varchar100 | 商品类型 |
| price | Float | 商品价格 |
| discountFloat | Float | 折后价格 |
| stock | Int | 存货数量 |
| sold | Int | 已售数量 |
| likes | Int | 收藏数量 |
| created | Date | 商家日期 |
| img | Varchar100 | 商品主图 |
| details | Varchar100 | 商品描述 |
商品类别表 关联商品信息表的types
|---------|------------|------|
| id | Int11 | 主键 |
| firsts | Varchar100 | 一级分类 |
| seconds | Varchar100 | 二级分类 |
购物车信息表
|-------------------|-------|-----------------------------------|
| id | Int11 | 主键 |
| quantity | Int11 | 购买数量 |
| commodityInfos_id | Int11 | 商品信息表的主键id 商品信息表id关联comm.._id |
| user_id | Int11 | Django内置用户表的主键id 关联Django内置用户表的id |
订单信息表
|---------|-----------|-----------------------------------|
| id | Int11 | 主键 |
| price | Float11 | 订单总价 购物车信息表结算费用写入price |
| created | Int11 | 订单创建时间 |
| user_id | Date | Django内置用户表的主键id 关联Django内置用户表的id |
| state | Varchar20 | 订单状态 |
- MyDjango------与项目名相同
- commodity------网站的商品列表页、商品详细页
- index------网站首页
- media------网站的媒体资源,存放商品的主图、详细介绍图
- pstatic------网站的静态资源,如CSS、JavaScript、网站界面图片
- shopper------购物车页面、个人中心页面、用户登录注册页面、在线支付功能
- templates------存放HTML模板文件,即网站的网页文件
3、项目配置Settings.py
settings.py 添加新增的文件夹,识别这些文件夹
实际开发中,需要根据实际情况对INSTALLED_APPS、MIDDLEWARE、TEMPLATES、DATABASES、STATIC_URL进行配置
完成网站的开发过程,网站上线阶段则配置属性DEBUG、ALLOWED_HOSTS
INSTALLED_APPS:识别新增的项目应用(App),新增新建的App
TEMPLATES:模板文件设置,App中创建的模板文件夹需要在配置属性DIRS中添加如'index/temp,APP_DIRS需要为True,否则无法从项目应用中查找模板文件
MIDDLEWARE:中间件的作用是处理用户请求信息和返回响应内容
DATABASES:配置数据库
"ENGINE": "django.db.backends.mysql",
"NAME": BASE_DIR / "db.sqlite3",
"NAME": 'xxxs', # 数据库名称
'USER': 'root', # mysql用户名
'PASSWORD': 'xxx', # mysql密码
'HOST': '127.0.0.1', # 数据库主机号
'PORT': '3306', # 数据库端口
或
创建my.cnf
python
[client]
database = 数据库名称
user = root
password = 密码
default-character-set = utf8
python
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"OPTIONS": {
"read_default_file": "my.cnf",
},
}
}
Django可以使用mysqlclient和pymysql模块实现MySQL
django--db--backends--mysql--base.py mysqlclient版本要求
如果是使用pymysql,则需要在项目名目录下__init__.py文件中写入:import pymysql pymysql.install_as_MySQLdb()
如果是使用MySQL8.0版本,加密方式需要改为原来的加密方式
ALTER USER 'root' @ 'localhost' IDENTIFIED WITH mysql_native_password BY 'newpassword'; FLUSH PRIVILEGES;
STATIC_URL进行配置:静态资源配置
python
"""
Django settings for xxxs project.
Generated by 'django-admin startproject' using Django 4.2.7.
For more information on this file, see
https://docs.djangoproject.com/en/4.2/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/4.2/ref/settings/
"""
from pathlib import Path
# Build paths inside the project like this: BASE_DIR / 'subdir'.
# 项目路径
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
# 密钥配置
SECRET_KEY = "xxx"
# SECURITY WARNING: don't run with debug turned on in production!
# 调试模式
DEBUG = True
# 域名访问权限
ALLOWED_HOSTS = []
# Application definition
# App列表
INSTALLED_APPS = [
"django.contrib.admin", # 内置的后台管理系统
"django.contrib.auth", # 内置的用户认证系统
"django.contrib.contenttypes", # 记录项目中所有model元数据(Django的ORM框架)
"django.contrib.sessions", # Session会话功能,用于标识当前访问用户的身份,记录相关用户信息
"django.contrib.messages", # 消息提示功能
"django.contrib.staticfiles", # 查找静态资源路径
'index',
'commodity',
'shopper',
]
# 中间件 用于处理Django的请求Request和相应Response
MIDDLEWARE = [
"django.middleware.security.SecurityMiddleware", # 内置的安全机制,保护用户与网站的通信安全
"django.contrib.sessions.middleware.SessionMiddleware", # 会话Session功能
"django.middleware.common.CommonMiddleware", # 处理请求信息,规范化请求内容
"django.middleware.csrf.CsrfViewMiddleware", # 开启CSRF防护功能
"django.contrib.auth.middleware.AuthenticationMiddleware", # 开启内置的用户认证系统
"django.contrib.messages.middleware.MessageMiddleware", # 开启内置的信息提示功能
"django.middleware.clickjacking.XFrameOptionsMiddleware", # 防止恶意程序单机劫持 LocaleMiddleware:国际化和本地化功能
]
# 路由入口配置 默认值是与项目同名的文件夹的urls.py文件
ROOT_URLCONF = "xxxs.urls"
# 模板配置 配置模板的解析引擎、模板的存放路径地址即内置功能模板使用配置信息
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",
],
},
},
]
# WSGI配置 告诉Django如何查找WSGI文件
WSGI_APPLICATION = "xxxs.wsgi.application"
# 数据库配置
# Database
# https://docs.djangoproject.com/en/4.2/ref/settings/#databases
# 配置数据库的连接信息,如连接数据库的模块、数据库名称、帐号和密码,默认连接SQLite数据库
# django.db.backends.postgresql/mysql/sqlite3/oracle
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
# "NAME": BASE_DIR / "db.sqlite3",
"NAME": 'xxx', # 数据库名称
'USER': 'root', # mysql用户名
'PASSWORD': 'xxx', # mysql密码
'HOST': '127.0.0.1', # 数据库主机号
'PORT': '3306', # 数据库端口
}
}
或者配置成以下方式
DATABASES = {
"default": {
"ENGINE": "django.db.backends.mysql",
"OPTIONS": {
"read_default_file": "my.cnf",
},
}
}
# Password validation
# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validators
# 内置Auth认证的功能配置
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",},
]
# Internationalization
# https://docs.djangoproject.com/en/4.2/topics/i18n/
# 国际与本地化配置 语言设置、不同时区时间的设置
LANGUAGE_CODE = "en-us"
LANGUAGE_CODE = "zh-hans"
TIME_ZONE = "UTC"
TIME_ZONE = "Asia/Shanghai"
USE_I18N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.2/howto/static-files/
# 静态资源配置
STATIC_URL = "static/"
# 添加并设置配置属性STATICFILES_DIRS
# 静态文件加载路径 如果静态文件不和app挂钩,可以在settings.py中添加STATICFILES_DIRS,之后DTL会在这个列表的路径中查找静态文件
STATICFILES_DIRS = (
BASE_DIR / 'static',
)
# STATIC_ROOT = BASE_DIR / 'AllStatic' 该文件夹与服务器之间构建映射关系
# 媒体资源配置
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
# Default primary key field type
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-field
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
# 发送邮件相关配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.qq.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'xxx@qq.com'
EMAIL_HOST_PASSWORD = 'xxx' # 开启服务授权码,在邮箱的设置更改密码下方的位置进行配置,配置需要发送短信,之后获得的码输入到此处
DEFAULT_FROM_EMAIL = 'xxx@qq.com' # 默认发送者
LOGIN_URL = '/auth/login'
4、路由 URL(Uniform Resource Locator 统一资源定位符)
互联网上标准资源的地址,用于指出网站文件的路径位置
5、数据模型搭建
ORM框架,实现面向对象编程
models id = models.AutoField(primary_key=True)
模型字段名称 数据类型 字段属性
str() 设置模型的返回值
默认情况:返回值为模型名+主键
模型扩展功能
python
class Meta: 设置模型的常用属性 元数据
db_table = 指定表名
unique_together = ('列名1', '列名2', ...) 联合约束,确定唯一记录
ordering = ['列名1', '-列名2'] 先按列名1升序排序,再按列名2降序排序
app_label = 指定该模型所属的应用
abstract = True 抽象模型,不能生成数据库表结构,只能作为其他模型的父类
当模型较多时,用包Package将模型拆分进行统一管理;将models.py文件拆分为xx.py和xxx.py后,需要在__init__.py文件中导入所有模型
settings.py的DATABASES属性中配置MySQL数据库连接信息
数据迁移指令
python manage.py makemigrations 新定义的模型会在项目应用的migrations文件夹中创建新的.py文件
python manage.py migrate 执行新建到数据库操作
python manage.py migrate 应用名 0001_initial 执行某个项目应用中的某个.py文件
其他迁移指令
squashmigrations、inspectdb、showmigrations、sqlflush、sqlsequencereset、remove_stale_contenttypes
数据导入(loaddata)与导出(dumpdata)
python manage.py dumpdata>data.json
data.json项目根目录下,如果要保存到指定的文件夹下,cd到该路径后执行命令
命令行需要python xxx/xxx/manage.py dumpdata>data.json
导出项目应用commodity中所有模型数据
python manage.py dumpdata commodity>data.json
导出项目应用commodity中模型Types的数据
python manage.py dumpdata commodity.Types>types.json
导入数据
python manage.py loaddata data.json
注:数据的导入需要以整个项目或整个项目应用的数据为单位,因为存在外键关联,只导入某张表数据,需要考虑该数据表是否设有外键且外键所关联的数据表是否已有数据
*关联关系型字段*
一对一关系
从表中增加xxx_id字段,关联主表的id
xxx = models.OneToOneField(to_field='id', to='table_name', on_delete=models.CASCADE, blank=True, null=True)
指向主表的id 指向主表 主表中删除一条记录,对应表也同步删除
一对多关系
主表的一条记录对应从表的多条记录
xxx = models.Foreignkey('主表的模型名称', on_delete=models.CASCADE) xxx_id
多对多关系
A表的一条记录和B表的多条记录对应,B表的一条记录和A表的多条记录对应(如:作者和图书,一个作者可以借阅多本图书,一本图书可以由多人借阅)
xxx = models.ManyToManyField(模型名, blank=True) 与模型建立多对多关系
作者信息表 多对多关联中间表 图书信息表
数据库基本操作
新增
- python manage.py shell 交互模式环境
- from xxx.models import goods 导入模型
- g = goods() 构建goods模型实例
- g.xxx = 'xxx' 为属性赋值
- 或 g = goods(xxx='xxx, ...)
- g.save() 通过save()方法将实例保存到数据库表中
- 或
- g = goods.objects.create(xxx='xxx', ...) 通过create()方法新增记录
- 或
- g = goods.objects.get_or_create(xxx='xxx', ...) 新增前检查记录是否存在
- 或
- d = dict(xxx='xxx',...)
- g = goods.objects.update_or_create(**d, defaults={'xxx':xxx}) 数据表中如存在该记录,对记录进行修改
- 或
- g1 = goods(xxx='xxx', ...) g2 = goods(xxx='xxx', ...) goods.objects.bulk_create([g1, g2]) 批量新增
查询
- goods.objects.all() 查找数据库表中所有记录
- QuerySet类型,对应于数据库表的记录集合(字典、元组)
- goods.objects.values() ...所有记录,以字典的形式表示
- goods.objects.values_list() 以列表的形式返回指定模型对象所对应的数据库表所有记录
- goods.objects.get(条件) 返回符合条件的记录
- goods.objects.first() 返回第一条记录 / last() 返回最后一条记录 / count() 返回数据个数
- goods.objects.filter(条件) 可以在组合条件下对数据库表中记录进行查找
- goods.objects.exclude(条件) 排除条件,返回不符合条件的记录
- goods.objects.order_by('id', '列名') 按照指定字段排序
- goods.objects.aggregate()
修改
- models.goods.objects.filter(条件).update(条件)
删除
- models.goods.objects.filter(条件).delete()
- models.goods.objects.filter(条件).distinct() 去掉重复记录
命令行
安装Django
pip install Django 或 下载.whl后 pip install D:\xxx.whl
创建Django项目
django-admin startproject MyDjango
查看Django版本
python import django django.version
创建项目应用,简称App,相当于网站功能
python manage.py startapp index
启动项目
python manage.py runserver 8001
创建Django内置功能的数据表(创建新表)
python manage.py makemigrations 创建模型对应的表结构命令文件
python manage.py migrate 创建新表结构
python manage.py makemigrations 新定义的模型会在项目应用的migrations文件夹中创建新的.py文件
python manage.py migrate 执行新建到数据库操作
python manage.py migrate 应用名 0001_initial 执行某个项目应用中的某个.py文件
数据导入(loaddata)与导出(dumpdata)
python manage.py dumpdata>data.json
导出项目应用commodity中所有模型数据
python manage.py dumpdata commodity>data.json
导出项目应用commodity中模型Types的数据
python manage.py dumpdata commodity.Types>types.json