Django | 執行項目下指定的腳本


1 描述

有時候會碰到這樣的場景,對於一些業務升級,我需要把數據庫數據做些處理,同時又想以 Django 項目的環境變量執行腳本,這個時候使用 python 腳本是再適合不過的手段了。

2 使用自帶的 shell

python manage.py shell < script

或者

./manage.py shell < script 
2.1 舉例

圖片描述

2.2 腳本代碼如下:


# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import unicode_literals from django.contrib.auth.models import User def show_user(): user = User.objects.get(username='admin') print 'I am {0}'.format(user.username) show_user() 

2.3執行命令

python manage.py shell < script1.py

2.4 運行結果如下:

2.4.1 安裝了 ipython(這里版本為 4.2.0)

圖片描述

2.4.2 沒有安裝 ipython

圖片描述

3 使用 django-extensions

  • 手段1:在 app 下面建立一個 scripts 包,然后建立你的腳本

  • 手段2:在項目目錄下面建立一個 scripts 包,然后建立你的腳本

運行腳本命令如下:

python manage.py runscript script_name 或者 ./manage.py runscript script_name 

3.1 手段1

3.1.1 針對手段1

圖片描述

3.1.2 腳本如下:

# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import unicode_literals from django.contrib.auth.models import User def run(): user = User.objects.get(username='admin') print 'project_dir/cat/scripts/:I am {0}'.format(user.username)

3.1.3 運行命令

python manage.py runscript showadmin 

3.1.4 執行結果如下

圖片描述

3.2 手段2

3.2.1 針對手段 2

圖片描述

3.2.2 腳本如下:

# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import unicode_literals from django.contrib.auth.models import User def run(): user = User.objects.get(username='admin') print 'project_dir/scripts/:I am {0}'.format(user.username) 

3.2.3 運行命令

./manage.py runscript showadmin 

3.2.4 執行結果

圖片描述

3.3 注意

runscript 命令會首先檢查每個 app 下的 scripts 目錄,如果找到對應名字的腳本就會執行.然后檢查 project_dir/scripts 目錄下是否包含符合名字的腳本,如果找到也會執行.也就是說,我們可以在不同的 app 中創建相同名字的腳本,並且都會被執行.

圖片描述

此時有兩個 showadmin.py 文件

  • djtest/cat/scripts/showadmin.py

  • djtest/scripts/showadmin.py

運行結果如下:

圖片描述

4 使用自定義命令

這個自行參照文檔

5 使用 migrations

示例如下:

from django.db import migrations from apps.xx.scripts.xx import run class Migration(migrations.Migration): initial = True dependencies = [ ('thirdservice', '0007_auto_20160909_1021'), ] operations = [ migrations.RunPython(run), ]

在 run 方法中封裝業務邏輯,這樣更為方便一些


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM