当前位置: 首页 > 面试题库 >

为什么在Django开发服务器中两次调用run?

通正平
2023-03-14
问题内容

我想让Django开发服务器在开始运行之前做一些事情。为此,我创建了一个新应用,将其添加到的顶部INSTALLED_APPS,然后management/commands/runserver.py使用以下代码在该应用中创建一个文件:

from django.contrib.staticfiles.management.commands.runserver import Command as RunserverCommand
class Command(RunserverCommand):
    def run(self, *args, **options):
        self.stdout.write('About to start running on ' + self.addr)
        super(Command, self).run(*args, **options)

(其实我想要做的事情是不是写作课程一行到标准输出,更复杂,但是这是一个演示该问题最简单的例子,我之所以超越run,而不是handle或其他方法,是因为我需要self.addr已经在运行此代码时设置。)

当我运行时./manage.py runserver,“关于要在127.0.0.1上开始运行”行不是出现一次,而是在服务器开始运行之前出现两次。为什么会这样,该怎么办?


问题答案:

事实证明,自动重新加载程序是罪魁祸首。事实证明,自动重新加载过程与原始过程具有相同的参数,并经过相同的初始化过程。解决方案是仅在自动重载程序产生的进程中未运行服务器前代码时才执行该代码,可以通过环境变量检测到该代码:

import os
from django.contrib.staticfiles.management.commands.runserver import Command as RunserverCommand
class Command(RunserverCommand):
    def run(self, *args, **options):
        if os.environ.get('RUN_MAIN') != 'true':
            self.stdout.write('About to start running on ' + self.addr)
        super(Command, self).run(*args, **options)


 类似资料:
  • 编辑:由于代码剪贴不会重现错误-这里有一个指向github repo的链接:(代码远未完成) https://github.com/altruios/clicker-game 我现在已经在两台计算机上运行了它——这两台计算机都有相同的行为,而代码剪报并没有显示出来。 因此,我正在构建一个clicker游戏来学习react,我不明白为什么这段代码会以这种方式运行: 在主应用程序中,我有以下功能: 那

  • 本文向大家介绍在 Django/Flask 开发服务器上使用 HTTPS,包括了在 Django/Flask 开发服务器上使用 HTTPS的使用技巧和注意事项,需要的朋友参考一下 使用 Django 或 Flask 这种框架开发 web app 的时候一般都会用内建服务器开发和调试程序,等程序完成后再移交到生产环境部署。问题是这些内建服务器通常都不支持 HTTPS,我们想在开发的时候就能够使用和测

  • 问题内容: 我是Go的新手。从文档中尝试了第一个问候,世界,并希望从请求中读取主机和方案: 但是它们的值都是空白。为什么? 问题答案: 基本上,由于您不是从HTTP代理访问HTTP服务器,因此浏览器可以发出相对的HTTP请求,如下所示: (当然,鉴于服务器正在本地主机端口8080上侦听)。 现在,如果您正在使用代理访问所述服务器,则代理可以使用绝对URL: 在这两种情况下,您从Go’s获得的都是原

  • 问题内容: 我有一个想法,可能是因为我正在做一些样式设计来更改单选按钮,但是我不确定。我正在设置一个onClick事件,该事件两次调用了我的函数。我已删除它以确保它没有在其他地方被触发,并且onClick似乎是罪魁祸首。 我的功能目前仅是运输选项的简单控制台日志: 如果没有任何理由可以在这里看到为什么会发生这种情况,我可以发布其余代码,但是有很多方面,我认为这与之无关,但是我认为这是一个很好的起点

  • 问题内容: 我想在Java-SE应用程序中使用拦截器,并且将weld作为CDI实现,并且在这里进行测试: 主班: 服务等级: 拦截器类: Aaa和输出: 我的问题 第一:为什么我在调用methodCallNumberTwo()时没有在methodCall()中调用拦截器? 第二:有办法改变吗? 我仅研究拦截器的行为,并且想了解。先感谢您! 问题答案: 不会调用拦截器,因为您是在对象的同一实例上调用

  • 下面的程序迭代一个字符串。迭代器将其在空格之间剪切,并返回每个单词。我使用for each循环来使用iterable字符串,在该循环中,我使用与外部循环中相同的迭代器对同一字符串再次迭代。输出是:hello 0 hello 2等。。。 但它应该是:你好0你好2。。。因为外部循环已经增加了迭代器的计数器。所以我想我在这张图片中遗漏了一些关于迭代器工作的东西。。。感谢您的帮助! 代码: