是否可以在 django 管理命令中创建子解析器?

2024-04-06

标题确实说明了一切,但我目前有这个,但它不起作用:

class Command(BaseCommand):
    help = ("Functions related to downloading, parsing, and indexing the  "
            "content")

    def add_arguments(self, parser):
        subparsers = parser.add_subparsers()

        download_parser = subparsers.add_parser(
            'download',
            help='Using a local CSV, download the XML data for content. '
                 'Output is sent to the log.'
        )
        download_parser.add_argument(
            '--start_line',
            type=int,
            default=0,
            help='The line in the file where you wish to start processing.'
        )

        # Add an argparse parser for parsing the content. Yes, this is
        # a bit confusing.
        content_parser_parser = subparsers.add_parser(
            'parse',
            help="Look at the file system and parse everything you see so that "
                 "we have content in the databse."
        )
        content_parser_parser.add_argument(
            '--start_item',
            type=int,
            default=0,
            help="Assuming the content is sorted by file name, this item is "
                 "the one to start on."
        )

我的具体想法是创建一个命令,其中包含用于下载 XML 内容或将其解析到数据库中的子命令。


Django 2.1 及以上版本

在 Django 2.1 及更高版本中,添加子命令很简单:

from django.core.management.base import BaseCommand

class Command(BaseCommand):

    def add_arguments(self, parser):
        subparsers = parser.add_subparsers(title="subcommands",
                                           dest="subcommand",
                                           required=True)

然后你使用subparser如果您正在编写一个使用以下内容的非 Django 应用程序,您也会这样做argparse https://docs.python.org/3/library/argparse.html。例如,如果您想要一个名为foo这可能需要--bar争论:

foo = subparsers.add_parser("foo")
foo.set_defaults(subcommand=fooVal)
foo.add_argument("--bar")

价值fooVal是你决定的subcommand选项应设置为当用户指定foo子命令。我经常将其设置为可调用。

旧版本的 Django

这是可能的,但需要一些工作:

from django.core.management.base import BaseCommand, CommandParser

class Command(BaseCommand):

    [...]

    def add_arguments(self, parser):
        cmd = self

        class SubParser(CommandParser):

            def __init__(self, **kwargs):
                super(SubParser, self).__init__(cmd, **kwargs)

        subparsers = parser.add_subparsers(title="subcommands",
                                           dest="subcommand",
                                           required=True,
                                           parser_class=SubParser)

你打电话时add_subparsers默认情况下argparse创建一个新的解析器,该解析器与您调用的解析器属于同一类add_subparser。碰巧你进入的解析器parser is a CommandParser实例(定义于django.core.management.base https://github.com/django/django/blob/0d3c616fbb2f49fa7ff6809e5a6777275352b35b/django/core/management/base.py#L43). The CommandParser class requires a cmd之前的论证**kwargs(而由提供的默认解析器类argparse只需要**kwargs):

def __init__(self, cmd, **kwargs):

因此,当您尝试添加子解析器时,它会失败,因为构造函数仅被调用**kwargscmd缺少参数。

上面的代码通过传入解决了这个问题parser_classargument 一个添加缺失参数的类。

需要考虑的事项:

  1. 在上面的代码中,我创建了一个新类,因为名称parser_class表明应该通过的是一个真正的类。然而,这也有效:

    def add_arguments(self, parser):
        cmd = self
        subparsers = parser.add_subparsers(
            title="subcommands",
            dest="subcommand",
            required=True,
            parser_class=lambda **kw: CommandParser(cmd, **kw))
    

    目前我还没有遇到任何问题,但将来可能会更改为argparse可能会导致使用 lambda 而不是真正的类失败。由于该参数被称为parser_class而不是类似的东西parser_maker or parser_manufacture我认为这样的改变是公平的。

  2. 我们不能只传递其中一只股票吗argparse类而不是传递自定义类parser_class?就不会有即时问题,但会产生意想不到的后果。中的评论CommandParser表明 的行为argparse的 Stick 解析器对于 Django 命令来说是不可取的。特别是,文档字符串 https://github.com/django/django/blob/122c90a43b2486bf278def8f068b6d1cebaa66f9/django/core/management/base.py#L44对于班级状态:

    """
    Customized ArgumentParser class to improve some error messages and prevent
    SystemExit in several occasions, as SystemExit is unacceptable when a
    command is called programmatically.
    """
    

    这是一个问题杰兹克的回答 https://stackoverflow.com/users/646765/jerzyk患有。这里的解决方案通过派生来避免这个问题CommandParser从而提供 Django 所需的正确行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在 django 管理命令中创建子解析器? 的相关文章

随机推荐

  • 将整数变量传递给任务而不丢失整数类型

    我有一个我不拥有的任务 实际上是一个角色 但在这里使用任务是为了使示例更容易 它对变量进行一些操作 它假设变量是整数 我需要以某种方式向它传递一个变量并将其作为 int 传递 但我没有任何运气 这是我不拥有的任务的超级简化版本 frob y
  • 信息堆大小

    我可以从以下网站获得哪些信息performance memoryChrome 中的对象 这些数字意味着什么 它们是kb还是字符 我可以从这些数字中了解到什么 示例值performance memory MemoryInfo jsHeapSi
  • 为什么这个正则表达式在 Java 中不能按预期工作?

    简单的正则表达式问题 答案很可能是 Java 特定的 This is a comment in a file matches 这会返回 false 据我所知 意味着它总是意味着什么 没有什么特殊意义 所以我就翻译一下 作为 字符串开头的 哪
  • 如何在 Linux 上用 C++ 播放或录制音频(以 .WAV 格式)?

    你好 我一直在寻找一种方法play and recordLinux 最好是 Ubuntu 系统上的音频 我目前正在开发一个前端语音识别工具包 https www launchpad net cmusphinx train这将自动执行调整语音
  • ASP.NET MVC 4 / Web API - 为接受插入 Razor 渲染器:text/html

    我正在使用 ASP NET MVC 4 Web API 创建 RESTful Web 服务 对于 API 访问 我返回 JSON 但一旦一切正常工作 内容协商应该默认适用于 XML 和 JSON 由于我正在致力于实现真正的 RESTful
  • Apache Hadoop Yarn - 核心利用率不足

    无论我如何修改设置yarn site xml即使用以下所有选项 yarn scheduler minimum allocation vcores yarn nodemanager resource memory mb yarn nodema
  • SocketException:套接字已关闭

    我正在使用 Java Sockets 创建一个聊天应用程序 并且得到了SocketException socket closed关闭服务器时 我收到错误即使我从未尝试连接客户端 只是停止服务器将会出现此套接字关闭异常 我知道错误意味着什么
  • 如何检测Azure Add-AzureAccount登录是否失败或被取消?

    在我使用的 Azure PowerShell 脚本中Add AzureAccount将用户登录到 Azure 但是如何检测用户是否未成功完成登录以便我可以中止脚本 另一种方法是使用 try 和 catch 块 try Add AzureAc
  • Haskell opengl 纹理 GLFW

    我一直在尝试获取一些仅使用 texcoords 在正方形上显示纹理的脚本 如果可能的话 您可以编辑脚本 以便它可以正常工作 从那里我可以了解您是如何做到的 因为这就是我学习的方式 import Control Monad unless wh
  • 找不到“AllowAnonymous”

    一切正常 直到我安装 包管理器控制台 邮政包 然后卸载并安装旧版本 现在我收到了以前没有的错误 错误 The type or namespace name AllowAnonymous could not be found are you
  • 引用类型存在于堆上,值类型存在于堆栈上

    在阅读 C 深度 时 我正在阅读标题为 引用类型位于堆上 值类型位于堆栈上 的部分 现在我能理解的是 主要针对 ref 类型 class Program int a 5 stored in heap public void Add int
  • 如何从 Nagios-Report Perl 模块打印 Nagios 服务 UP 时间百分比

    我可以打印出来HostUP 时间百分比从Nagios 报告 Perl 模块 http search cpan org hopcrofts Nagios Report 0 003 与以下代码 usr bin perl use strict u
  • 如何在iPhone中设置标签栏中的徽章值?

    我使用以下代码在当前选项卡栏中设置徽章值 但它在选项卡栏中不可见 self navigationController tabBarItem badgeValue 1 将徽章值放入选项卡栏中的正确方法是什么 这是我访问 tabBarItem
  • 每次服务器重新启动后 MySQL 都会损坏

    我有一个有点奇怪的问题 我在 Windows 环境中运行 MySQL 和 Drupal 站点 不是出于选择 但这就是事情的结果 大多数时候该站点都很好 但是每次服务器重新启动 从更新或维护 时数据库将损坏 当我登录 MySQL Work b
  • Android 圆形边框表格

    如何在 Android 中制作一个带有圆形边框的表格 如下图所示 我认为 Androidbase 链接到了错误的问题 他最近问了一个类似的问题 这是answer https stackoverflow com questions 23795
  • Git 提交与旧的、已失效的用户而不是我现在拥有的用户相关联

    我的机器曾经有一个与某个 GitHub 帐户 account a 关联的 RSA 密钥 我从钥匙链中删除了该密钥 创建了一个新密钥 将其添加到链中 然后确保我在 GitHub 上拥有的任何其他帐户不再有任何与其关联的 SSH 密钥 请注意
  • Android Studio 1.5.1中的JSON解析

    我在 Eclipse ADT 上进行了 JSON 解析 并且运行完美 但是 当在 Android Studio 上使用相同的代码时 它在 DefaultHttpClient 和该块中的所有其他单词中显示错误 这是我的 JSON 解析器类 J
  • DATE 字段和 MONTH() YEAR() 函数上的 INDEX

    日期 日期时间列上的索引未针对 YEAR col MONTH col 函数进行优化是否仍然正确 比尔 卡文给出了相当明确的答案here http forums mysql com read php 115 86654 86654 msg 8
  • Chrome 控制台行为中的双美元 $$() 与美元符号 $()

    在我们的项目中 当 Chrome 控制台中一个美元符号使用 与两个美元符号 时 有不同的功能 besides已知的区别是 返回一个数组 而 返回第一个元素 例如 特定元素的选择器 具有一美元和两美元查询 my class my attrib
  • 是否可以在 django 管理命令中创建子解析器?

    标题确实说明了一切 但我目前有这个 但它不起作用 class Command BaseCommand help Functions related to downloading parsing and indexing the conten