初入 python Django 框架总结

1. 初入

最近接收一个python 改造项目,初始信息满满,中间很疲惫、很想放弃,最后咬牙完成,先将遇到的问题、要点记录如下:

2. Django

Django的默写技术要点参考:
https://www.runoob.com/django/django-project-intro.html

2.1 模块

目录下建立一个__init__.py的空文件,这个目录就会被认为是一个模块;

2.2 应用

一个项目中可以新建多个应用-app,类似于不同业务功能的模块。

在 Django 里,应用属于项目内部独立的功能模块,具备自身的数据模型、视图、模板以及 URL 配置,能够独立运行,也能集成到其他项目中。应用的存在让代码实现了模块化管理,使项目结构更为清晰,也便于复用。

应用的主要用途

功能拆分:可以把项目按照功能拆分成不同的应用,比如博客项目可拆分为用户认证、文章管理、评论系统等多个应用。

代码复用:开发完成的应用能够在其他项目中直接使用,不用重新编写代码。

独立维护:各个应用之间相互独立,修改一个应用不会对其他应用造成影响。

应用和项目的区别

项目:它是配置和应用的集合,代表着整个 Web 服务,一个项目可以包含多个应用。

应用:专注于实现某个具体功能,例如用户管理、商品展示等。

应用的创建与使用

创建应用:借助命令 python manage.py startapp app_name 就能创建一个应用。

注册应用:要在项目的 settings.py 文件里的 INSTALLED_APPS 列表中添加应用名称,这样 Django 才能识别该应用。

2.3 数据库交互

Django 模型使用自带的 ORM。

对象关系映射(Object Relational Mapping,简称 ORM )用于实现面向对象编程语言里不同类型系统的数据之间的转换。

ORM 在业务逻辑层和数据库层之间充当了桥梁的作用。

ORM 是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中。实例如下:

python 复制代码
table_list_valuable = TableMeta.objects.filter(need_push=True,tablename__in=table_list)
 TableMeta.objects.filter(need_push=True, db=db).values_list('tablename', flat=True)} 
 update_time_key = ColumnMeta.objects.filter(table=table,columnname=db.update_time_key,is_valuable=True).first()
 max_time  = RecordOfKafkaPush.objects.filter(table_name=table.tablename, db_name=db.database).aggregate(max_time=Max('record_time'))['max_time']
 ColumnMeta.objects.filter(table=table,columnname=db.update_time_key,is_valuable=True).exists():
 RecordOfKafkaPush.objects.filter(db_name=db.database, table_name=table.tablename).delete()

3. 基础配置

3.1 依赖的下载 :

如果不翻墙,直接拉取某些国外依赖,一般会失败,比如:(cx_Oracle、pymssql、django),

可以通过miniconda 管理依赖,配置拉取国内镜像:

pip/conda/minicondata/

3.2 pycharm 如何配置debug

Django 项目控制台的启动命令是:

bash 复制代码
cd myproject
python manage.py runserver

但如果直接通过控制台启动的话,无法debug,Pycharm需要配置如下:

并且在settings.py中配置:

4. 开发接口

4.1 接口内容
python 复制代码
@method_decorator(csrf_exempt, name='dispatch')
class ScheduleTask(View):
    def post(self, request, *args, **kwargs):
        try:
            data = json.loads(request.body)
            table_list = data.get('table_list', None)
            if table_list:
                # global import_table_list
                # import_table_list = table_list
                logging.info(f"接收到的表列表:{table_list}")
        except json.JSONDecodeError as e:
            logging.error(f"JSON解析错误: {e}")
            logging.info("没有接收到表列表,使用默认表列表")
        logging.info("start as task to init import")
        dbbase = getDbbase(True, table_list)
        return format_response({'message': 'OK'})

@method_decorator(csrf_exempt, name='dispatch')
class ScheduleTaskTwo(View):
    def post(self, request, *args, **kwargs):
        try:
            data = json.loads(request.body)
            table_list = data.get('table_list', None)
            if table_list:
                # global import_table_list
                # import_table_list = table_list
                logging.info(f"接收到的表列表:{table_list}")
        except json.JSONDecodeError as e:
            logging.error(f"JSON解析错误: {e}")
            logging.info("没有接收到表列表,使用默认表列表")
        logging.info("start as task to init import")
        dbbase = getDbbase(False, table_list)
        return format_response({'message': 'OK'})
4.2 接口定义
python 复制代码
from django.urls import path
from . import views
from . import viewScond
app_name = 'api'

urlpatterns = [
    path('get_init_task', viewScond.ScheduleTask.as_view(),name='get_init_task'),
    path('get_add_task', viewScond.ScheduleTaskTwo.as_view(),name='get_add_task'),
]
4.2 接口调用

5. 定时任务写法

5.1 创建后台调度器
python 复制代码
# 创建后台调度器
scheduler = BackgroundScheduler()
scheduler.add_job(task_of_schedule, 'interval', days=1)
scheduler.start()
# schedule.every(1).days.do(task_of_schedule)

参考:https://cloud.tencent.com/developer/article/2454200?policyId=1004

5.2 多线程、并发
python 复制代码
def async_threaded(func):
    """将函数转换为异步线程调用的装饰器"""
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        thread = threading.Thread(target=func, args=args, kwargs=kwargs)
        thread.start()
        return thread  # 返回线程对象,可用于join或检查状态
    return wrapper
@async_threaded
def task_of_schedule():
    logging.info("task_of_schedule start")
    getDbbase(False)
    logging.info("task_of_schedule end")
相关推荐
玄同7654 分钟前
Python 后端三剑客:FastAPI/Flask/Django 对比与 LLM 开发选型指南
人工智能·python·机器学习·自然语言处理·django·flask·fastapi
爱吃泡芙的小白白11 分钟前
环境数据多维关系探索利器:Pairs Plot 完全指南
python·信息可视化·数据分析·环境领域·pairs plot
冉冰学姐12 分钟前
SSM智慧社区管理系统jby69(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·管理系统·智慧社区·ssm 框架
杨超越luckly19 分钟前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
派葛穆20 分钟前
Python-批量安装依赖
开发语言·python
pchaoda21 分钟前
RSI与布林带技术指标实战
python·matplotlib·量化
番茄灭世神26 分钟前
Python从入门到精通 第一章
python
Elastic 中国社区官方博客27 分钟前
Elasticsearch:Workflows 介绍 - 9.3
大数据·数据库·人工智能·elasticsearch·ai·全文检索
B站_计算机毕业设计之家30 分钟前
豆瓣电影推荐系统 | Python Django Echarts构建个性化影视推荐平台 大数据 毕业设计源码 (建议收藏)✅
大数据·python·机器学习·django·毕业设计·echarts·推荐算法