zoukankan      html  css  js  c++  java
  • 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 方法中封装业务逻辑,这样更为方便一些

  • 相关阅读:
    NOIP 2016 回文日期
    USACO Ski Course Design
    USACO Combination Lock
    USACO 利润Profits
    POJ 3368 Frequent values
    USACO Balanced Lineup
    JDOJ 1065 打倒苏联修正主义
    JDOJ 2174 忠诚
    VIJOS-P1514 天才的记忆
    VIJOS-P1423 最佳路线
  • 原文地址:https://www.cnblogs.com/ExMan/p/9516805.html
Copyright © 2011-2022 走看看