Django
一、Django
一、项目创建流程
1.Create a Django Project
django-admin startproject myproject
cd myproject
2.Create a Django App
python manage.py startapp myapp
3.Register the App
myproject/settings.py
and add 'myapp'
to the INSTALLED_APPS
list:
INSTALLED_APPS = [
...
'myapp',
]
4.Define Models
In myapp/models.py
:
from django.db import models
class MyModel(models.Model):
name = models.CharField(max_length=100)
created_at = models.DateTimeField(auto_now_add=True)
5.Make and Apply Migrations
python manage.py makemigrations
python manage.py migrate
6.Create a Superuser
python manage.py createsuperuser
7.Run the Development Server
python manage.py runserver
二、大致框架
├── db.sqlite3
├── dockerfile
├── Jenkinsfile
├── manage.py
├── powerforecast_curve (app)
│ ├── admin.py
│ ├── apps.py
│ ├── constants.py
│ ├── init.py
│ ├── middleware.py
│ ├── migrations
│ ├── models.py
│ ├── scripts
│ │ ├── add_data.py
│ ├── serializers.py
│ ├── settings
│ │ ├── common.py
│ │ ├── init.py
│ │ ├── production.py
│ │ └── test.py
│ ├── tasks.py
│ ├── tests.py
│ ├── urls.py
│ └── views.py
├── powerforecast_django (proj)
│ ├── asgi.py
│ ├── celery.py
│ ├── init.py
│ ├── settings
│ │ ├── common.py
│ │ ├── dev.py
│ │ ├── init.py
│ │ ├── local.py
│ │ ├── prod.py
│ │ └── test.py
│ ├── urls.py
│ └── wsgi.py
├── README.md
└── requirements.txt
二、Django cmd
一、常用命令
1.创建用户、项目、APP
python manage.py createsuperuser
django-admin startproject projectname
python manage.py startapp appname
2.启动服务
python manage.py runserver
python manage.py runserver 8000
3.启动脚本
python manage.py runscript <scriptname> --script-args <args>
4.启动测试
python manage.py test <appname>
5.检测项目问题
python manage.py check
三、Django shell
一、数据操作实例:
1.启动
python manage.py shell
2.导入
from powerforecast_curve.models import Province
3.创建新实例
province = Province(name='New Province',bucket_name='new-bucket')
province.save()
4.查询所有实例
provinces = Province.objects.all()
for province in provinces:
print(province.name, province.bucket_name)
5.获取特定实例
province = Province.objects.get(id=37)
print(province.name, province.bucket_name)
6.更新实例
province = Province.objects.get(id=37)
province.bucket_name = 'pub-forecast-shandong-13'
province.save()
7.删除实例
province = Province.objects.get(id=37)
province.delete()
四、Celery(这里是为了加定时任务暂不细说,大家可以看官方文档https://celeryproject.readthedocs.io/zh-cn/latest/django/index.html学习一下)
一、beat
1.beat启动命令(带定时任务)
celery -A powerforecast_django beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler
二、worker
1.Celery Worker
celery -A your_project_name worker --loglevel=info
五、我开发的django项目示例
一、项目结构说明
powerforecast_django/ # 项目根目录
│
├── powerforecast_curve/ # 应用目录
│ ├── migrations/ # 数据库迁移文件存放目录
│ │ ├── 0001_initial.py # 初始数据库迁移文件
│ │ ├── ... # 其他数据库迁移文件
│ │ └── __init__.py # 迁移目录初始化文件
│ ├── admin.py # Django admin 配置文件
│ ├── apps.py # 应用配置文件
│ ├── constants.py # 常量定义文件
│ ├── __init__.py # 应用初始化文件
│ ├── middleware.py # 中间件定义文件
│ ├── models.py # 数据库模型定义文件
│ ├── scripts/ # 脚本存放目录
│ │ └── add_data.py # 添加数据的脚本文件
│ ├── serializers.py # 序列化器定义文件
│ ├── settings/ # 应用配置文件夹
│ │ ├── common.py # 公共设置文件
│ │ ├── __init__.py # 初始化设置文件
│ │ ├── production.py # 生产环境设置文件
│ │ ├── test.py # 测试环境设置文件
│ │ └── ... # 其他环境设置文件
│ ├── sub_models/ # 子模型存放目录
│ │ ├── __init__.py # 子模型包初始化文件
│ │ ├── power_data.py # 电力数据模型文件
│ │ └── province.py # 省份模型文件
│ ├── sub_serializers/ # 子序列化器存放目录
│ │ ├── __init__.py # 子序列化器包初始化文件
│ │ ├── dataserializers.py # 数据序列化器文件
│ │ └── errors.py # 错误处理序列化器文件
│ ├── sub_views/ # 子视图存放目录
│ │ ├── __init__.py # 子视图包初始化文件
│ │ ├── export_data.py # 导出数据视图文件
│ │ └── powerdata.py # 电力数据视图文件
│ ├── tasks.py # 任务定义文件(如 Celery 任务)
│ ├── tests.py # 测试文件
│ ├── urls.py # 应用 URL 配置文件
│ └── views.py # 视图函数文件
│
├── changelog # 变更日志文件或目录
├── db.sqlite3 # SQLite 数据库文件(开发环境使用)
├── dockerfile # Docker 构建文件
├── Jenkinsfile # Jenkins CI/CD Pipeline 配置文件
├── manage.py # Django 命令行工具
│
├── powerforecast_django/ # Django 项目配置目录
│ ├── asgi.py # ASGI 应用入口
│ ├── celery.py # Celery 配置文件
│ ├── __init__.py # 项目初始化文件
│ ├── logs/ # 日志目录
│ │ └── log_file.log # 日志文件
│ ├── settings/ # 项目配置文件夹
│ │ ├── common.py # 公共设置文件
│ │ ├── dev.py # 开发环境设置文件
│ │ ├── __init__.py # 初始化设置文件
│ │ ├── local.py # 本地环境设置文件
│ │ ├── prod.py # 生产环境设置文件
│ │ └── test.py # 测试环境设置文件
│ ├── urls.py # 项目 URL 配置文件
│ └── wsgi.py # WSGI 应用入口
│
├── README.md # 项目的 README 文件
└── requirements.txt # Python 依赖包列表
二、运行
1.运行前需要更改的配置
-
1.更改powerforecast_django.setting中的DATABASES
-
2.更改powerforecast_django.setting中的CELERY_BROKER_URL
2.运行单元测试
# 到与manage.py同级目录下。
cd path_to_project
# 运行单元测试,验证各个接口和功能模块是否存在问题。
python manage.py test powerforecast_curve
3.运行项目
不同环境配置的相关启动命令可参考https://docs.djangoproject.com/en/5.0/topics/settings/#designating-the-settings
# 到与manage.py同级目录下。
cd path_to_project
# env为不同环境,可选 dev/test/prod/local
python manage.py runserver --settings powerforecast_django.settings.{{dev}}
# 也可以在每次运行实用程序时显式传入设置模块。
export DJANGO_SETTINGS_MODULE=powerforecast_django.settings.dev
pytyon manage.py runserver
4.运行脚本
# 到与manage.py同级目录下。
cd path_to_project
# 执行脚本
python manage.py runscript <script_name> --script-args <arg1> <arg2>
# 示例
python manage.py runscript add_data --script-args 14 2024-06-20
5.celery beat
# 启动项目之后另起一个终端启动beat,如果命令中不带scheduler参数则不会触发定时任务
celery -A powerforecast_django beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler
6.celery woker
# 启动项目之后另起一个终端启动woker
celery -A powerforecast_django worker --loglevel=info
7.admin后台
# 添加superuser,admin后台管理url:http://localhost:8000/admin/
python manage.py createsuperuser
三、后续开发注意事项
1.添加app
- 1.在项目根目录下使用 Django 命令行工具创建新应用
python manage.py startapp new_app_name
- 2.在项目的 settings/common.py 文件中注册新应用
INSTALLED_APPS = [
...
'new_app_name',
...
]
2.添加model
- 1.在应用的sub_models目录下中定义新的模型文件,该文件包括模型类,类中包括字段和方法。
- 2.生成数据库迁移文件
python manage.py makemigrations
- 3.应用数据库迁移
python manage.py migrate
3.添加视图
- 1.在应用的sub_views目录下中定义新的视图文件,在该文件中添加新的视图函数和类
- 2.在应用的 urls.py 文件中添加 URL 路由
urlpatterns = [
...
path('../../new_view/', token_required_with_response(views.new_view.as_view()), name='new_view'),
]
- 3.确保项目的主 urls.py 文件包含应用的 URL 路由
urlpatterns = [
path("admin/", admin.site.urls),
path("api/v1/", include("powerforecast_curve.urls")),
]
4.添加脚本
- 1.在应用的 scripts 目录下创建新的 Python 脚本文件。
- 2.在必要时,可以使用 Celery 或其他任务调度工具将脚本集成到项目的自动化工作流程中。
5.添加单元测试
- 1.在应用的 tests.py 文件中或适当的测试文件中编写新功能的单元测试。
- 2.使用 Django 提供的 TestCase 类或其他适当的测试框架编写测试用例,覆盖新功能的各种场景和边界条件
- 3.确保每个测试都能独立运行且具有清晰的断言和预期结果。
6.异常处理中间件
- 路径:powerforecast_curve/middleware.py
- 功能:用于在 Django 应用中统一捕获和处理异常。
- 若需要添加修改异常处理只改此文件即可。
四、开发中可能遇到的问题
1.数据库迁移问题
-
问题描述:
在修改模型字段或添加新模型后,可能会遇到数据库迁移失败、数据丢失或数据不一致的问题。 -
避免方法:
- 1.使用 makemigrations 和 migrate 命令时,要检查一遍生成的迁移文件。
- 2.对于复杂的数据库操作,可以分阶段进行迁移。
- 3.在开发和生产环境中使用相同的数据库引擎和版本。
- 4.线上每次发版都要做一遍数据迁移。
2.循环导入问题
-
问题描述:
由于两个模块互相导入,导致程序运行时出现 ImportError -
避免方法:
- 1.重构代码,减少模块之间的依赖。
- 2.将公共函数或类移到单独的模块中,以避免循环依赖。
- 3.使用 import 语句时,尽量放在函数或类的内部,而不是模块的顶部。
- 4.在模型中可以使用字符串形式引用模型类名称。
示例:# 该代码的文件路径powerforecast_curve/sub_models/power_data.py from .province import Province class BasePowerData(models.Model): ... province = models.ForeignKey( Province, on_delete=models.SET_NULL, null=True, blank=True, help_text="省份ID" ) ... # 可以改为如下代码 class BasePowerData(models.Model): ... province = models.ForeignKey( "Province", on_delete=models.SET_NULL, null=True, blank=True, help_text="省份ID" ) ...
3.定时任务启动问题。
-
问题描述:
服务、woker、beat都正常启动了,可是admin后台管理定义的定时任务没有跑。 -
避免方法:
- 1.确保celery配置正确,包括 Celery 的 broker和 backend 配置。
- 2.检查定时任务中是否正确设置了cron表达式,和任务名称、调度时间。
- 3.确保你的任务被正确注册在 Celery 中
- 4.在启动beat时,要加上scheduler参数。
celery -A powerforecast_django beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler