Django 基础篇

django 基础篇

基本工具

  • env虚拟机 - virtualenvwrapper-win

    • 安装: pip install virtualenvwrapper-win
    • 基本指令:
      • 创建: mkvirtualenv <虚拟机名称>
      • 列表: workon
      • 进入: workon <虚拟机名称>
      • 删除: rmvirtualenv <虚拟机名称>
  • python

  • django

基本概念

  • Model: 与资料库栏位对映
  • Template: 可於一般HTML内加入for、if等等判断
  • View: 逻辑编写
    https://ithelp.ithome.com.tw/upload/images/20201201/20132538WUnMw26Z7r.jpg

专案创建

  • 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")

<<:  SQL JOIN 共七种

>>:  ISO 27001 机房管理部份之四

[Day14] 初见碰撞系统

到目前为止,我们有了时间,可以输入,还可以对「物件」进行位移,看来可以开始让「小铁(LittleIr...

Day01 - 目前才看到第三章 Object

this&Object Prototype Ch3 Object 我的天,真的太久没翻你,试...

10.13 应用系统的防护基准 - 其他(除旧布新)

适用人员: 技术人员(开发人员)。 适用法规: 资通安全责任等级分级办法 - 附表十资通系统防护基准...

【第十九天 - Flutter Firebase Dynamic Links】

前言 今日想要介绍 Deep Link,这边我只有接收 deeplink 的连结实作,并没有使用动态...

获得资讯系统运行授权(authorization)而应首先开发的文件-安全和隐私计划(Security and privacy plans)

-NIST SDLC 和 RMF 资讯系统所有者应准备授权包并将其提交给适当的 授权操作(ATO)...