DjangoNote

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值