Django编写自定义manage命令

我们再使用Django写项目的时候,不可避免的我们会使用到一些manage命令,如django-admin startproject,python manage.py runserver …等命令,然后这些命令就能完成相应的事情。

但有时候Django自带的这些命令也不能满足我们的需求,我们就可以自己编写实现自己的一些需求的命令了。

例如:我们实现一个createuser的命令。我们在终端执行这条命令的时候,就会在数据库创建一个user对象出来。

准备工作:

首先新建一个Django项目,然后新建一个user的app,然后在user的models文件里面编写一个User模型。

from django.db import models

# Create your models here.
class User(models.Model):
    name = models.CharField(max_length=20)
    telephone = models.CharField(max_length=11)
    email = models.EmailField()

然后在settings.py文件里面配置好数据库的相关信息,因为我使用的是mysql数据库,所以需要配置,如果使用Django默认的sqlite数据库,就不用配置。

然后执行makemigrations和migrate命令,将模型映射到数据库中。

至此,我们就做好准备工作了。

注意: 这个app必须在settings.py文件中注册。否则会找不到自定义的命令

创建编写manage命令的文件

在Django中,我们想要编写自定义的manage命令,旧的遵循Django的规则来创建文件。

首先,我们在刚才新建的app下面新建一个包,(必须是包,不能是文件夹)这个包的名字为management,必须和这个一模一样,然后在management这个包下面再新建一个包,名字为commands,这样我们就创建好了存放manage命令文件的包,然后在这个包中新建一个python文件,文件的名字就为命令的名字,例如,我创建 了一个selfcommand的文件,也就是我创建的命令的名称为selfcommand
这个app最终的目录结构为:
在这里插入图片描述
这样,我们就创建好了编写代码的文件。

编写代码

首先,我们创建一个名为Command的类,这个类的名字必须为这个。然后继承自django.core.management.BaseCommand类。

from django.core.management import BaseCommand

class Command(BaseCommand):
    help = '创建一个user用户'

    def handle(self, *args, **options):
        pass

help这个变量可写可不写,这个变量的作用是在使用命令的-h--help参数时会显示出来的文字,在这里我们可以写入这条命令的作用,描述。

handle函数:这个函数是必须写的函数,我们使用这条命令的时候就会执行这个函数里面的代码。

因为我们这条命令的主要功能是创建一个user用户,所以我们首先导入User对象,然后开始编写代码。

from user.models import User
class Command(BaseCommand):
    help = '创建一个user用户'

    def handle(self, *args, **options):
        User.objects.create(name='aaa',telephone='1111111111',email='aaa@qq.com')
        self.stdout.write('用户创建成功')

注意: 这里我们一般不使用print()打印信息,而是使用self.stdout.write来打印信息。

这样,我们就编写好了一条简单的创建一个user对象的命令。然后我们在终端执行命令:

python manage.py selfcommand(在创建的包的下面的文件的名字)

然后在终端就会打印出用户创建成功的信息,然后我们去数据库也能查看到创建的user对象的信息

在这里插入图片描述
但是,这个时候就会出现一个比较尴尬的问题,就是我们创建user用户的时候,肯定需要别人自己输入信息,但是我们并没有让别人自己输入信息,而是直接创建一个定死的user对象。所以,这个时候就需要我们给这条命令添加参数了。

如果想给命令添加参数,那么我们在这个类中就得新建一个方法,名为add_argument

class Command(BaseCommand):
    help = '创建一个user用户'

    def add_arguments(self, parser):
        parser.add_argument('name',help="指定name字段")  # name 必须参数,输入的第一个参数的值将赋值给name,必须参数
        parser.add_argument('-t','--telephone',help="指定telephone字段")   # 可选参数 -t 或 --telephone -t是简写形式。

    def handle(self, *args, **options):
        name = options['name']
        if options['telephone']:
            telephone = options['telephone']
        else:
            telephone = '11111111111'
        User.objects.create(name=name,telephone=telephone,email='aaa@qq.com')
        self.stdout.write('用户创建成功')

在上面我们定义了两个参数,一个必须参数,一个可选参数,因此,我们再使用这条命令的时候必须传入name参数,而telephone参数可以不传,然后我们在handel方法中对得到的参数进行了处理。

python manage.py selfcommand ccc
python manage.py selfcommand ddd -t 18888888888

我们也可以使用python manage.py -h查看这条命令的帮助,也能看到我么自定义的参数。

我们再使用命令的时候,特别在使用一些刚接触不久的命令的时候,很容易出现非正确的使用命令,那么我们就需要抛出一个异常,告诉他命令使用错误了。

首先我们的导入一个类

from django.core.management import CommandError

例如,我们在传入手机号码的时候,如果位数超过了11位,那么我们就抛出一个异常:

def handle(self, *args, **options):
	name = options['name']
    if options['telephone']:
        telephone = options['telephone']
        if len(telephone) >= 11:
            raise CommandError("手机号码不能超过11位")
    else:
        telephone = '11111111111'
    User.objects.create(name=name,telephone=telephone,email='aaa@qq.com')
    self.stdout.write('用户创建成功')

这里,我们就使用到了CommandError类来抛出了异常,从而保证了我们程序的健壮性了。

当用户输入的电话号码长度大于11位的时候,就会抛出一个异常而终止程序。

注意: 我们在参数中输入的值,在handel函数中都是以字符窜的形式得到,就算我们输入的是整数,也会变成字符窜的形式,如果想得到整数形式的值,我们可以在add_argument()中添加type=int参数。

示例:

parser.add_argument('id',help="user对象的id",type=int)

更多有关自定义manage命令的操作可以查看官方文档:https://docs.djangoproject.com/zh-hans/2.1/howto/custom-management-commands/

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Django中,可以使用django-admin来创建自定义的RBAC认证系统。以下是一些步骤: 1. 创建一个新的Django应用程序: ``` python manage.py startapp rbac ``` 2. 在rbac应用程序中创建一个新的文件夹,命名为“rbac”。 3. 在rbac文件夹中创建一个新的文件,命名为“middleware.py”。 4. 在middleware.py中编写一个自定义的认证中间件类,可以参考下面的示例代码: ``` from django.contrib.auth.models import User class RbacMiddleware(object): def process_request(self, request): user = request.user if user.is_authenticated(): user_role = user.groups.first() if user_role: permissions = user_role.permissions.all() request.user_permissions = [p.codename for p in permissions] ``` 该中间件类的作用是在请求处理之前对用户进行认证,并将该用户的权限列表存储在请求对象中。 5. 在settings.py中配置中间件: ``` MIDDLEWARE_CLASSES = ( # ... 'rbac.middleware.RbacMiddleware', # ... ) ``` 6. 创建一个新的文件夹,命名为“rbac_templates”。 7. 在rbac_templates文件夹中创建一个新的文件,命名为“base.html”。 8. 在base.html中编写一个自定义的RBAC模板标签,可以参考下面的示例代码: ``` {% if perms.app_label.permission_name %} <!-- Display some content here --> {% endif %} ``` 该模板标签的作用是根据用户的权限列表显示或隐藏特定的内容。 9. 在需要进行RBAC认证的视图函数中使用模板标签,例如: ``` def my_view(request): return render(request, 'my_template.html', {}) ``` 10. 在my_template.html中使用自定义的RBAC模板标签: ``` {% extends 'rbac_templates/base.html' %} {% block content %} {% if perms.app_label.permission_name %} <h1>Welcome to my page!</h1> {% else %} <p>You do not have permission to view this page.</p> {% endif %} {% endblock %} ``` 以上就是使用django-admin自定义RBAC认证的一些步骤。需要注意的是,这只是一个简单的示例,实际情况可能更加复杂,需要根据具体的应用场景进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值