django 基础篇
基本工具
env虚拟机 - virtualenvwrapper-win
安装:pip install virtualenvwrapper-win
基本指令:创建: mkvirtualenv <虚拟机名称>
列表: workon
进入: workon <虚拟机名称>
删除: rmvirtualenv <虚拟机名称>
python
版本: 3.7.4 官方载点django
版本: 3.1 官方文档安装:pip install django==3.1
基本概念
Model: 与资料库栏位对映Template: 可于一般HTML内加入for、if等等判断View: 逻辑编写
专案创建
django-admin startproject <专案名称>
python manage.py runserve
开启本地伺服器,预设 8000 port 目录结构 | manage.py \---djangoAPI asgi.py settings.py urls.py wsgi.py __init__.py
manage.py
: django命令包 参考asgi.py
: ASGI兼容的Web服务器上的入口settings.py
: 项目配置文件(DB、金钥、引用apps...)urls.py
: 主要路由器(各功能urls可于此集中)wsgi.py
: WSGI兼容的Web服务器上的入口__init__.py
: 一个空文件,告诉python这个目录是一个python包 参考创建功能模组
python manage.py startapp <功能名称>
目录结构 | manage.py \---testSetting | admin.py | apps.py | models.py | tests.py | views.py | __init__.py | urls.py(自行定义) | \---migrations __init__.py
admin.py
: 管理员设置migrations
: 资料库创建纪录models.py
: 资料库模型views.py
: 功能逻辑urls.py
: 该功能路由基础配置
路由
官方参考
于各功能模组中新增urls.py
档案 from django.urls import path from . import views urlpatterns = [ path('', views.index, name = 'index'), ]
于 专案 路由载入 功能模组 from django.urls import path, include urlpatterns = [ path('testSetting/', include('testSetting.urls')) ]
于网址列输入时,须以前缀表示EX: 127.0.0.0.1/testSetting/,如此一来在拥有很多个app时,如果有相同的views.index就能够区分DB
多DB配置官方参考
# 于setting.py中配置# Database 路由连线设置DATABASES = { # 预设sqlite 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }, # MSSQL连线配置 'testSetting': { 'ENGINE': 'sql_server.pyodbc', 'NAME': '<DB名称>', 'USER': '<使用者>', 'PASSWORD': '<密码>', 'HOST': '<IP>', 'PORT': '<port>', 'OPTIONS': { 'driver':'SQL Server Native Client 11.0', 'MARS_Connection': True, } }}# Database 路由# database_router.DatabaseAppsRouter 需自行新增,可参考官方配置DATABASE_ROUTERS = ['<projectName>.database_router.DatabaseAppsRouter']DATABASE_APPS_MAPPING = { 'testSetting': 'testSetting'}
model 範例
# 这是一个最基本的範例class test(models.Model): # 继承models testTest = models.CharField(max_length=5) # 对应资料表栏位 class Meta: managed = False app_label = 'testSetting' # DB路由的名称 db_table = "test" # 资料表名称
Meta.managed = False 代表进行makemigration动作时,不进行迁移,这在已经存在的资料表非常好用DB事务所
当进行一连串的新增、修改资料时,常常希望全部成功在一次更新。例如银行交易,A转帐给B,需要A扣款与B入帐同时成功,如果A扣款成功,但B帐号冻结等等,则A的钱就不见了,这就是我们需要解决的问题。
# 功能实现 - 使用装饰器from django.db import transaction # 载入回滚工具@transaction.atomic(using="DBName")def atomicTest(): # 设定回滚位置,如果已下功能有失败的部份,就会回到这个储存点 sid = transaction.savepoint(using="DBName") try: # 此处执行修改、新增DB... # 因为使用了atomic修饰词,所以DB不会自动提交commit(即不会修正、新增...) # 送出事务commit(此处送出,才算真的成功) transaction.savepoint_commit(sid, using="DBName") except ValueError as e: # 自定义错误,将状态回滚到sid(储存点) transaction.savepoint_rollback(sid, using="DBName") except Exception as e: # 未知错误,将状态回滚到sid(储存点) transaction.savepoint_rollback(sid, using="DBName")