{"id":5862,"date":"2022-04-03T10:53:14","date_gmt":"2022-04-03T02:53:14","guid":{"rendered":"https:\/\/egonlin.com\/?p=5862"},"modified":"2022-04-03T10:53:25","modified_gmt":"2022-04-03T02:53:25","slug":"02-django%e6%ba%90%e7%a0%81%e5%88%86%e6%9e%90%e4%b9%8b%e5%90%af%e5%8a%a8wsgi%e5%8f%91%e7%94%9f%e4%ba%86%e5%93%aa%e4%ba%9b%e4%ba%8b","status":"publish","type":"post","link":"https:\/\/egonlin.com\/?p=5862","title":{"rendered":"02 django\u6e90\u7801\u5206\u6790\u4e4b\u542f\u52a8wsgi\u53d1\u751f\u4e86\u54ea\u4e9b\u4e8b"},"content":{"rendered":"<p>\u4e00 \u524d\u8a00<\/p>\n<pre><code>\u597d\u591a\u4eba\u5bf9\u6280\u672f\u7684\u7406\u89e3\u90fd\u505c\u7559\u5728\u61c2\u5f97\u4f7f\u7528\u5373\u53ef\uff0c\u56e0\u800c\u53ea\u4f1a\u7528\u800c\u4e0d\u4f1a\u7075\u6d3b\u7528\uff0c\u4fd7\u8bdd\u8bf4\u597d\u5947\u5bb3\u6b7b\u732b\uff0c\u4e0d\u7136\u6211\u4e5f\u4e0d\u4f1a\u5728\u51cc\u66681.48\u7684\u65f6\u5019\u51b3\u5b9a\u5199\u8fd9\u7bc7\u535a\u5ba2\uff0c\u597d\u5427\u4e0d\u5570\u55e6\u4e86\n\n\u7ee7\u7eed\u4e0a\u4e00\u7bc7\u6587\u7ae0\uff0c\u540e\u6211\u6709\u4e2a\u95ee\u9898\uff08\u4e0a\u6587\uff1a\"\u4e00\u7bc7\u6587\u7ae0\u7406\u89e3web\u6846\u67b6\u672c\u8d28&\u624b\u64b8\u4e00\u4e2aweb\u6846\u67b6https:\/\/www.cnblogs.com\/xiaoyuanqujing\/articles\/11641028.html\"\uff09\n\n\u95ee\uff1adjango\u662f\u5982\u4f55\u901a\u8fc7\u7f51\u7edcsocket\u5c42\u63a5\u6536\u6570\u636e\u5e76\u5c06\u8bf7\u6c42\u8f6c\u53d1\u7ed9django\u7684urls\u5c42\n\n\u6709\u7684\u4eba\u5f20\u53e3\u5c31\u6765\u554a\uff1a\n\n     \u5c31\u662f\u901a\u8fc7wsgi\uff08Web Server Gateway Interface\uff09\u554a\n\n     Django\u6846\u67b6\u5b8c\u5168\u9075\u5faawsgi\u534f\u8bae\uff0c\u5e95\u5c42\u91c7\u7528socket\u3001socketserver\u3001select\u7f51\u7edc\u6a21\u578b\u5b9e\u73b0\uff0c\u53ef\u4ee5\u5229\u7528\u64cd\u4f5c\u7cfb\u7edf\u7684\u975e\u5835\u585e\u548c\u7ebf\u7a0b\u6c60\u7b49\u7279\u6027\n\n     Django\u672c\u8eab\u662f\u7528python\u4ee3\u7801\u5b9e\u73b0\u7684wsgi\u670d\u52a1\uff0c\u5e76\u53d1\u975e\u5e38\u4f4e\uff0c\u9ed8\u8ba46\u4e2a\n\n      \u800c\u7ebf\u4e0a\u90e8\u7f72django\u9879\u76ee\u65f6\u4e00\u822c\u91c7\u7528C\u8bed\u8a00\u5b9e\u73b0\u7684uWSGI\n\n\u4e0a\u9762\u8bf4\u7684\u6ca1\u9519\uff0c\u4f46\u662f\uff0c\u8fd9\u4ed6\u5988\u7528\u5f97\u7740\u4f60\u8bf4\u5417\uff01egon\u6765\u5e26\u5927\u5bb6\u8bfb\u4e00\u8bfb\u6e90\u7801\u5427\uff0c\u8fd9\u5e94\u8be5\u53ef\u4ee5\u8bf4\u660e\u4e00\u5207\n\nps\uff1a\u50a8\u5907\u77e5\u8bc6\n\n\u7f51\u7edc\u7f16\u7a0b\uff1ahttps:\/\/www.cnblogs.com\/linhaifeng\/articles\/6129246.html\n\n\u6ce8\u610fsocketserver\u4e00\u5b9a\u8981\u770b\uff0c\u56e0\u4e3a\u6211\u9ed8\u8ba4\u4f60\u4f1a\u4e86\u8fd9\u4e2a\u4e1c\u897f<\/code><\/pre>\n<p>\u4e8c \u987a\u85e4\u6478\u74dc<br \/>\n\u770b\u6e90\u7801\uff0c\u627e\u5230\u7a0b\u5e8f\u7684\u5165\u53e3\u662f\u7b2c\u4e00\u6b65\uff0c\u5f88\u7b80\u5355\uff0c\u6211\u4eec\u600e\u4e48\u542f\u52a8django\u6765\u7740<\/p>\n<p>python3.6 manage.py runserver 8088 <\/p>\n<h1>ps\uff1a<\/h1>\n<h1>python\u89e3\u91ca\u5668\u7248\u672c\uff1a3.6<\/h1>\n<h1>django\u7248\u672c\uff1a2.2.7<\/h1>\n<pre><code>\u597d\u4e86\uff0c\u5c31\u5b83manage.py\uff0c\u6211\u4eec\u6765\u770b\u770b\u5b83\u91cc\u9762\u90fd\u5e72\u4e86\u4e9b\u5565\uff08\u8bfb\u6e90\u7801\u4e0d\u5fc5\u9762\u9762\u4ff1\u5230\uff0c\u627e\u5230\u5173\u952e\u4ee3\u7801\u5373\u53ef\uff09<\/code><\/pre>\n<h1>!\/usr\/bin\/env python<\/h1>\n<p>&quot;&quot;&quot;Django&#8217;s command-line utility for administrative tasks.&quot;&quot;&quot;<br \/>\nimport os<br \/>\nimport sys<\/p>\n<p>def main():<br \/>\nos.environ.setdefault(&#8216;DJANGO_SETTINGS_MODULE&#8217;, &#8216;Foo.settings&#8217;)<br \/>\ntry:<br \/>\nfrom django.core.management import execute_from_command_line<br \/>\nexcept ImportError as exc:<br \/>\nraise ImportError(<br \/>\n&quot;Couldn&#8217;t import Django. Are you sure it&#8217;s installed and &quot;<br \/>\n&quot;available on your PYTHONPATH environment variable? Did you &quot;<br \/>\n&quot;forget to activate a virtual environment?&quot;<br \/>\n) from exc<br \/>\nexecute_from_command_line(sys.argv)<\/p>\n<p>if <strong>name<\/strong> == &#8216;<strong>main<\/strong>&#8216;:<br \/>\nmain()<\/p>\n<pre><code> \u6267\u884c\u4e86 django.core.management\u4e0b\u7684execute_from_command_line \uff0c\u5173\u952e\u4ee3\u7801\u662fexecute_from_command_line\uff0c\u770b\u5b83\u5c31\u597d\n\n \u4f46\u5728\u8fd9\u4e4b\u524d\u9700\u8981\u63d0\u4e00\u5634django.core.management\u662f\u4e00\u4e2a\u5305\uff0c\u5728\u5bfc\u5165\u65f6\u4f1a\u6267\u884c\u5176\u4e0b\u7684__init__.py\uff0c\u8fd9\u91cc\u9762\u4e0d\u4ec5\u6709\u6211\u4eec\u5c06\u8981\u770b\u7684execute_from_command_line\uff0c\u5176\u5b9e\u8fd8\u505a\u4e86\u5f88\u591a\u5176\u4ed6\u4e8b<\/code><\/pre>\n<h1>\u5728\u5bfc\u5165from django.apps import apps\u65f6\u4f1a\u8fd0\u884cdjango.apps.<strong>init<\/strong>.py\u6587\u4ef6\uff0c\u8fd9\u662f\u6574\u4e2adjango\u7a0b\u5e8f\u7684\u5f00\u7aef\uff0c\u5b83\u5176\u5b9e\u505a\u4e86\u975e\u5e38\u591a\u7684\u4e8b\u60c5\uff08\u4f8b\u5982\uff1a\u521d\u59cb\u5316\u65e5\u5fd7\u6a21\u5757\u3001\u52a0\u8f7dINSTALL_APP\u3001\u68c0\u67e5\u5404APP\u662f\u5426\u6b63\u5e38\u3001\u68c0\u67e5\u7f13\u5b58\u6a21\u5757\u662f\u5426\u6b63\u5e38\u7b49\uff09\uff0c\u5f53\u4e00\u5207\u65e0\u8bef\u65f6\u624d\u4f1a\u5f80\u4e0b\u8d70\uff0c\u5426\u5219\u5c06\u4f1a\u62a5\u9519\u9000\u51fa\u7a0b\u5e8f\u3002<\/h1>\n<pre><code>\u6211\u4eec\u6765\u770b\u4e00\u4e0bdjango.core.management.__init__.py\u4e2d\u7684execute_from_command_line<\/code><\/pre>\n<p>def execute_from_command_line(argv=None):<br \/>\n&quot;&quot;&quot;Run a ManagementUtility.&quot;&quot;&quot;<br \/>\nutility = ManagementUtility(argv) # \u8c03\u7528\u5f53\u524d\u6587\u4ef6\u4e2d\u7684\u7c7bManagementUtility\u4ea7\u751f\u5bf9\u8c61\uff0c\u8fd9\u4e2a\u7c7b\u5c31\u5728\u8be5\u51fd\u6570\u7684\u4e0a\u65b9\uff0c\u4e00\u627e\u5c31\u80fd\u627e\u5230<br \/>\nutility.execute()                 # \u8c03\u7528\u7c7bManagementUtility\u4e2d\u7684\u65b9\u6cd5execute<\/p>\n<pre><code> \u5173\u952e\u4ee3\u7801utility.execute() \uff0c\u53bb\u7c7bManagementUtility\u4e2d\u53ef\u4ee5\u627e\u5230\uff0c\u8be5\u65b9\u6cd5\u7279\u522b\u957f\uff0c\u5c31\u4e0d\u5217\u4e3e\u4e86\uff0c\u4e00\u8fde\u4e32if\u6761\u4ef6\u5c31\u662f\u5224\u65ad\u53c2\u6570\u662f\u5426\u5408\u6cd5\n\n \u5173\u952e\u4ee3\u7801\u5728self.fetch_command(subcommand).run_from_argv(self.argv)\uff0c\u94fe\u5f0f\u8c03\u7528\uff0c\u6211\u4eec\u4e00\u70b9\u4e00\u70b9\u6765\u770b\n\n \u5148\u770bfetch_command(subcommand)\uff0c\u5373fetch_command('runserver'),\u5c31\u5728\u7c7bManagementUtility\u4e2d\u5f80\u4e0a\u7ffb\u53ef\u4ee5\u627e\u5230\u8be5\u65b9\u6cd5\uff0c\u5173\u952e\u4ee3\u7801\u5728\u6ce8\u91ca\u91cc\u6211\u90fd\u6807\u6ce8\u597d\u4e86<\/code><\/pre>\n<p>def fetch_command(self, subcommand):<br \/>\n&quot;&quot;&quot;self.fetch_command<br \/>\n\u662f\u5229\u7528django\u5185\u7f6e\u7684\u547d\u4ee4\u7ba1\u7406\u5de5\u5177\u53bb\u5339\u914d\u5230\u5177\u4f53\u7684\u6a21\u5757\uff0c\u4f8b\u5982self.fetch_command(subcommand)\u5176\u5b9e\u5c31\u76f8\u5f53\u4e8e\u662fself.fetch_command(&#8216;runserver&#8217;)\uff0c\u5b83\u6700\u7ec8\u627e\u5230\u4e86==django.contrib.staticfiles.management.commands.runserver.Command==\u8fd9\u4e2a\u547d\u4ee4\u5de5\u5177\u3002<br \/>\ndjango\u4e2d\u7684\u547d\u4ee4\u5de5\u5177\u4ee3\u7801\u7ec4\u7ec7\u91c7\u7528\u7684\u662f\u7b56\u7565\u6a21\u5f0f+\u63a5\u53e3\u6a21\u5f0f\uff0c\u4e5f\u5c31\u662f\u8bf4django.core.management.commands\u8fd9\u4e2a\u76ee\u5f55\u4e0b\u9762\u5b58\u5728\u5404\u79cd\u547d\u4ee4\u5de5\u5177\uff0c\u6bcf\u4e2a\u5de5\u5177\u4e0b\u9762\u90fd\u6709\u4e00\u4e2aCommand\u63a5\u53e3\uff0c\u5f53\u5339\u914d\u5230&#8217;runserver&#8217;\u65f6\u8c03\u7528&#8217;runserver&#8217;\u547d\u4ee4\u5de5\u5177\u7684Command\u63a5\u53e3\uff0c\u5f53\u5339\u914d\u5230&#8217;migrate&#8217;\u65f6\u8c03\u7528&#8217;migrate&#8217;\u547d\u4ee4\u5de5\u5177\u7684Command\u63a5\u53e3\u3002<br \/>\n&quot;&quot;&quot;<br \/>\ncommands = get_commands() # \u5173\u952e\u4ee3\u78011<br \/>\ntry:<br \/>\napp_name = commands[subcommand] # \u5173\u952e\u4ee3\u78012<br \/>\nexcept KeyError:<br \/>\nif os.environ.get(&#8216;DJANGO_SETTINGS_MODULE&#8217;):<br \/>\nsettings.INSTALLED_APPS<br \/>\nelse:<br \/>\nsys.stderr.write(&quot;No Django settings specified.\\n&quot;)<br \/>\npossible_matches = get_close_matches(subcommand, commands)<br \/>\nsys.stderr.write(&#8216;Unknown command: %r&#8217; % subcommand)<br \/>\nif possible_matches:<br \/>\nsys.stderr.write(&#8216;. Did you mean %s?&#8217; % possible_matches[0])<br \/>\nsys.stderr.write(&quot;\\nType &#8216;%s help&#8217; for usage.\\n&quot; % self.prog_name)<br \/>\nsys.exit(1)<br \/>\nif isinstance(app_name, BaseCommand):<br \/>\nklass = app_name<br \/>\nelse:<br \/>\nklass = load_command_class(app_name, subcommand) # \u5173\u952e\u4ee3\u78013<br \/>\nreturn klass # \u5173\u952e\u4ee3\u78014<\/p>\n<pre><code>\u5173\u952e\u4ee3\u78011\uff1aget_comands()\u4f1a\u8fd4\u56de\u4e00\u4e2a\u5b57\u5178\n\n\u5173\u952e\u4ee3\u78012\uff1aapp_name = commands[subcommand]\u53d6\u503c\u64cd\u4f5c\u5373app_name='django.core' \n\n\u5173\u952e\u4ee3\u78013\uff1aklass = load_command_class(app_name, subcommand)\u5373klass = load_command_class('django.core' \uff0c\u2019runserver\u2018)\uff0c\u81ea\u5df1\u53bb\u770b\u5f88\u7b80\u5355\uff0cklass=django.core.management.commands.runserver.Command\u7c7b\n\n\u597d\u5566\uff0c\u6b64\u65f6\u6211\u4eec\u5f97\u77e5self.fetch_command(subcommand)\u5f97\u5230\u7684\u662f\u7c7bCommand\uff0c\u597d\u591a\u4eba\u5c31\u5728\u8fd9\u61f5\u903c\u4e86\uff0c\u63a5\u4e0b\u6765\u94fe\u5f0f\u8c03\u7528\u5e94\u8be5\u53bb\u627erun_from_argv(self.argv)\u4e86\uff0c\u4f46\u662f\u5728Command\u7c7b\u4e2d\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u50bb\u903c\u4e86\u5427\uff0c\u53bbCommand\u7684\u7236\u7c7bBaseCommand<\/code><\/pre>\n<p>\u91cc\u627e\u554a\uff0c\u50bb\u53c9\uff08\u8fd9\u5c31\u662f\u597d\u591a\u4eba\u770b\u6e90\u7801\u7684\u5fc3\u6001\uff0c\u770b\u7740\u770b\u7740\u5c31\u5d29\u4e86\uff0c\u5d29\u51e0\u6b21\u5c31\u75af\u4e86\uff09<\/p>\n<p>class BaseCommand:<br \/>\ndef run_from_argv(self, argv):<br \/>\n&quot;&quot;&quot;<br \/>\nrun_from_argv\u7684\u4f5c\u7528\u662f\u521d\u59cb\u5316\u4e2d\u95f4\u4ef6\u3001\u542f\u52a8\u670d\u52a1\uff0c\u4e5f\u5c31\u662f\u62c9\u8d77wgsi(\u4f46\u5b9e\u9645\u4e0a\u5e76\u4e0d\u662f\u7531\u5b83\u6765\u76f4\u63a5\u5b8c\u6210\uff0c\u800c\u662f\u7531\u540e\u7eed\u5f88\u591a\u5176\u4ed6\u4ee3\u7801\u6765\u5b8c\u6210)\uff0c\u76f4\u89c2\u4e0a\u770b\u5b83\u5e94\u8be5\u662frunserver.Command\u5bf9\u8c61\u7684\u4e00\u4e2a\u65b9\u6cd5\uff0c\u4f46\u5b9e\u9645\u4e0a\u8981\u7a0d\u5fae\u66f4\u590d\u6742\u4e00\u4e9b\uff0c\u56e0\u4e3a\u6ca1\u6709\u5217\u51fa\u5173\u8054\u4ee3\u7801\uff0c\u6240\u4ee5\u5728\u4e0b\u4e00\u4e2a\u4ee3\u7801\u5757\u4e2d\u8fdb\u884c\u8bf4\u660e\u3002<br \/>\n&quot;&quot;&quot;<br \/>\nself._called_from_command_line = True<br \/>\nparser = self.create_parser(argv[0], argv[1])<\/p>\n<pre><code>    options = parser.parse_args(argv[2:])\n    cmd_options = vars(options)\n    args = cmd_options.pop('args', ())\n    handle_default_options(options)\n    try:\n        self.execute(*args, **cmd_options) # \u5173\u952e\u4ee3\u7801\n    except Exception as e:\n        if options.traceback or not isinstance(e, CommandError):\n            raise\n        if isinstance(e, SystemCheckError):\n            self.stderr.write(str(e), lambda x: x)\n        else:\n            self.stderr.write('%s: %s' % (e.__class__.__name__, e))\n        sys.exit(1)\n    finally:\n        try:\n            connections.close_all()\n        except ImproperlyConfigured:\n\n            pass\n\n \u5173\u952e\u4ee3\u7801self.execute(*args, **cmd_options),\u6ce8\u610f\u4e86\uff0c\u8fd9\u4e2aexecute\u5e94\u8be5\u53bbCommand\u7c7b\u91cc\u627e\u554a\uff0c\u56e0\u4e3a\u8be5self\u662fCommand\u7c7b\u7684\u5bf9\u8c61\u554a\uff0c\u8ba9\u6211\u4eec\u56de\u5230Command\u7c7b\u4e2d\uff0c\u627eexecute<\/code><\/pre>\n<p>class Command(BaseCommand):<br \/>\n\u3002\u3002\u3002\u3002\u3002\u3002\u3002<br \/>\ndef execute(self, *args, *<em>options):<br \/>\nif options[&#8216;no_color&#8217;]:<br \/>\nsuper().execute(<\/em>args, **options) # \u5173\u952e\u4ee3\u78011<\/p>\n<pre><code>def get_handler(self, *args, **options):\n    \"\"\"Return the default WSGI handler for the runner.\"\"\"\n    return get_internal_wsgi_application()\n\ndef handle(self, *args, **options):\n    if not settings.DEBUG and not settings.ALLOWED_HOSTS:\n        raise CommandError('You must set settings.ALLOWED_HOSTS if DEBUG is False.')\n\n    self.use_ipv6 = options['use_ipv6']\n    if self.use_ipv6 and not socket.has_ipv6:\n        raise CommandError('Your Python does not support IPv6.')\n    self._raw_ipv6 = False\n    if not options['addrport']:\n        self.addr = ''\n        self.port = self.default_port\n    else:\n        m = re.match(naiveip_re, options['addrport'])\n        if m is None:\n            raise CommandError('\"%s\" is not a valid port number '\n                               'or address:port pair.' % options['addrport'])\n        self.addr, _ipv4, _ipv6, _fqdn, self.port = m.groups()\n        if not self.port.isdigit():\n            raise CommandError(\"%r is not a valid port number.\" % self.port)\n        if self.addr:\n            if _ipv6:\n                self.addr = self.addr[1:-1]\n                self.use_ipv6 = True\n                self._raw_ipv6 = True\n            elif self.use_ipv6 and not _fqdn:\n                raise CommandError('\"%s\" is not a valid IPv6 address.' % self.addr)\n    if not self.addr:\n        self.addr = self.default_addr_ipv6 if self.use_ipv6 else self.default_addr\n        self._raw_ipv6 = self.use_ipv6\n    self.run(**options) # \u5173\u952e\u4ee3\u78012\n\ndef run(self, **options):\n    use_reloader = options['use_reloader']\n\n    if use_reloader:\n        autoreload.run_with_reloader(self.inner_run, **options)\n    else:\n        self.inner_run(None, **options) # \u5173\u952e\u4ee3\u78013\n\ndef inner_run(self, *args, **options):\n    autoreload.raise_last_exception()\n\n    threading = options['use_threading']\n    shutdown_message = options.get('shutdown_message', '')\n    quit_command = 'CTRL-BREAK' if sys.platform == 'win32' else 'CONTROL-C'\n\n    self.stdout.write(\"Performing system checks...\\n\\n\")\n    self.check(display_num_errors=True)\n    self.check_migrations()\n    now = datetime.now().strftime('%B %d, %Y - %X')\n    self.stdout.write(now)\n    self.stdout.write((\n        \"Django version %(version)s, using settings %(settings)r\\n\"\n        \"Starting development server at %(protocol)s:\/\/%(addr)s:%(port)s\/\\n\"\n        \"Quit the server with %(quit_command)s.\\n\"\n    ) % {\n        \"version\": self.get_version(),\n        \"settings\": settings.SETTINGS_MODULE,\n        \"protocol\": self.protocol,\n        \"addr\": '[%s]' % self.addr if self._raw_ipv6 else self.addr,\n        \"port\": self.port,\n        \"quit_command\": quit_command,\n    })\n\n    try:\n        handler = self.get_handler(*args, **options)\n        run(self.addr, int(self.port), handler,\n            ipv6=self.use_ipv6, threading=threading, server_cls=self.server_cls) # \u5173\u952e\u4ee3\u78014\n    except socket.error as e:\n        ERRORS = {\n            errno.EACCES: \"You don't have permission to access that port.\",\n            errno.EADDRINUSE: \"That port is already in use.\",\n            errno.EADDRNOTAVAIL: \"That IP address can't be assigned to.\",\n        }\n        try:\n            error_text = ERRORS[e.errno]\n        except KeyError:\n            error_text = e\n        self.stderr.write(\"Error: %s\" % error_text)\n        os._exit(1)\n    except KeyboardInterrupt:\n        if shutdown_message:\n            self.stdout.write(shutdown_message)\n        sys.exit(0)\n\n\u5173\u952e\u4ee3\u78011\uff1asuper().execute(*args, **options)\u4f1a\u53bb\u7236\u7c7bBaseCommand\u4e2d\u627e\u5230excute\u65b9\u6cd5\uff0c\u8be5\u65b9\u6cd5\u4e2d\u7684\u5173\u952e\u4ee3\u7801\u4e3aoutput = self.handle(*args, **options)\uff0c\u8be5self\u662fCommand\u7c7b\u7684\u5bf9\u8c61\uff0c\u6240\u4ee5\u63a5\u7740\u53bbCommand\u7c7b\u4e2d\u627e\u5230handle\u65b9\u6cd5\n\n\u5173\u952e\u4ee3\u78012->\u5173\u952e\u4ee3\u78013->\u5173\u952e\u4ee3\u78014->\u5b9a\u4f4d\u5230\u4e00\u4e2arun\u65b9\u6cd5\uff0c\u8be5\u65b9\u6cd5\u5c31\u5728\u672c\u6587\u4ef6\u5f00\u5934\u4f4d\u7f6e\u5bfc\u5165\u8fc7<\/code><\/pre>\n<p>from django.core.servers.basehttp import (<br \/>\nWSGIServer, get_internal_wsgi_application, run,<br \/>\n)<\/p>\n<pre><code>\u622a\u6b62\u5230\u8be5\u90e8\u5206\uff0c\u5b9e\u9645\u4e0a\u5c31\u662f\u4e00\u4e2a\u521d\u59cb\u5316\u8fc7\u7a0b\uff0c\u5168\u90e8\u90fd\u4e3a'runserver'\u670d\u52a1\uff0c\u867d\u7136\u5f88\u591a\u4ee3\u7801\u6211\u6ca1\u6709\u5217\u51fa\u6765\uff0c\u4f46\u662f\u5b83\u786e\u5b9e\u505a\u4e86\u4e00\u4e9b\uff0c\u4f8b\u5982\u53c2\u6570\u89e3\u6790\u3001\u7aef\u53e3\u6307\u5b9a\u68c0\u6d4b\u3001ipv4\u68c0\u6d4b\u3001ipv6\u68c0\u6d4b\u3001\u7aef\u53e3\u662f\u5426\u5360\u7528\u3001\u7ebf\u7a0b\u68c0\u67e5\u7b49\u5de5\u4f5c\u3002\n\u63a5\u4e0b\u6765\u6211\u628a\u6ce8\u610f\u529b\u653e\u5728django.core.servers.basehttp\u4e0b\u7684run\u51fd\u6570\u4e0a\uff0c\u4ee3\u7801\u5982\u4e0b<\/code><\/pre>\n<p>def run(addr, port, wsgi_handler, ipv6=False, threading=False, server_cls=WSGIServer): # \u5f62\u53c2wsgi_handler\u7684\u503c\u4e3aStaticFilesHandler<br \/>\n&quot;&quot;&quot;\u77e5\u4f1a\u5404\u4e2a\u5bf9\u8c61\u542f\u52a8wsgi\u670d\u52a1&quot;&quot;&quot;<br \/>\nserver_address = (addr, port)<br \/>\nif threading:<br \/>\nhttpd_cls = type(&#8216;WSGIServer&#8217;, (socketserver.ThreadingMixIn, server_cls), {}) # \u5173\u952e\u4ee3\u78011<br \/>\nelse:<br \/>\nhttpd_cls = server_cls<br \/>\nhttpd = httpd_cls(server_address, WSGIRequestHandler, ipv6=ipv6) # \u5173\u952e\u4ee3\u78012<br \/>\nif threading:<br \/>\nhttpd.daemon_threads = True<br \/>\nhttpd.set_app(wsgi_handler) # \u5173\u952e\u4ee3\u78013<br \/>\nhttpd.serve_forever() # \u5173\u952e\u4ee3\u78014<\/p>\n<pre><code> \u5173\u952e\u4ee3\u78011\uff1a\u8c03\u7528\u5185\u7f6e\u5143\u7c7btype\u521b\u5efa\u4e00\u4e2a\u7c7bWSGIServer\uff0c\u8be5\u7c7b\u7ee7\u627f\u4e86(socketserver.ThreadingMixIn, WSGIServer),\u53bb\u4ee3\u7801\u5757WSGIServer\u7c7b\u4e2d\u67e5\u770b\u5b83\u672c\u8eab\u53ea\u7ee7\u627f\u4e86wsgiref.simple_server.WSGIServer\u3001object\u8fd9\u4e24\u4e2a\u7c7b\uff0c\u901a\u8fc7type\u91cd\u65b0\u521b\u5efa\u4e00\u4e0b\u662f\u7ed9\u7c7bWSGIServer\u5f3a\u884c\u6dfb\u52a0\u4e86\u4e00\u4e2a\u7239socketserver.ThreadingMixIn,\u8fd9\u4e48\u505a\u7684\u610f\u4e49\u662f\u6bcf\u6b21\u8c03\u7528\u7c7bWSGIServer\u7684\u65f6\u5019\u90fd\u4f1a\u5355\u72ec\u542f\u7528\u4e00\u4e2a\u7ebf\u7a0b\u6765\u5904\u7406\uff0c\u8bf4\u5b8c\u4e86WSGIServer\u7684\u7b2c\u4e00\u4e2a\u57fa\u7c7b\uff0c\u6211\u4eec\u518d\u6765\u8bf4\u5b83\u7684\u7b2c\u4e8c\u4e2a\u57fa\u7c7bWSGIServer\u5b8c\u6574\u7684\u7ee7\u627f\u5bb6\u65cf<\/code><\/pre>\n<p>django.core.servers.basehttp.WSGIServer<br \/>\nwsgiref.simple_server.WSGIServer\u3001 socketserver.ThreadingMixIn<br \/>\nhttp.server.HTTPServer<br \/>\nsocketserver.TCPServer<br \/>\nsocketserver.BaseServer<br \/>\nobject<\/p>\n<p>httpd_cls\u8fd9\u4e2a\u53d8\u91cf\u88ab\u5b9a\u4e49\u5b8c\u6210\u4e4b\u540e\uff0c\u7531\u4e8e\u5927\u91cf\u7684\u7ee7\u627f\u5173\u7cfb\uff0c\u5b83\u5176\u5b9e\u5df2\u7ecf\u4e0d\u5355\u7eaf\u7684\u5c5e\u4e8edjango\uff0c\u5b83\u662f\u4e00\u4e2a\u4f20\u7edf\u610f\u4e49\u4e0a\u7684WSGI\u670d\u52a1\u5bf9\u8c61\u4e86\u3002<\/p>\n<pre><code>\u5173\u952e\u4ee3\u78012\uff1ahttpd = httpd_cls(server_address, WSGIRequestHandler, ipv6=ipv6)\u8fd9\u884c\u4ee3\u7801\u975e\u5e38\u91cd\u8981\uff0c\u56e0\u4e3a\u5b83\u662fWSGI\u670d\u52a1\u5668\u4e0edjango\u4e4b\u95f4\u76f8\u4e92\u901a\u4fe1\u7684\u552f\u4e00\u67a2\u7ebd\u901a\u9053\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53WSGI\u670d\u52a1\u5bf9\u8c61\u6536\u5230socket\u8bf7\u6c42\u540e\uff0c\u4f1a\u5c06\u8fd9\u4e2a\u8bf7\u6c42\u4f20\u9012\u7ed9django\u7684WSGIRequestHandler(\u4e0b\u8282\u4f1a\u5217\u51faWSGIRequestHandler\u662f\u5982\u4f55\u5de5\u4f5c\u7684)\u3002<\/code><\/pre>\n<p>\u5173\u952e\u4ee3\u78013\uff1ahttpd.set_app(wsgi_handler)\u662f\u5c06django.contrib.staticfiles.handlers.StaticFilesHandler \u4f20\u9012\u7ed9WSGIServer\u5f53\u4f5c\u4e00\u4e2aapplication\uff0c\u5f53WSGIServer\u6536\u5230\u7f51\u7edc\u8bf7\u6c42\u540e\uff0c\u53ef\u4ee5\u5c06\u6570\u636e\u5206\u53d1\u7ed9django.core.servers.basehttp.WSGIRequestHandler\uff0c\u6700\u7ec8\u7531django.core.servers.basehttp.WSGIRequestHandler\u5c06\u6570\u636e\u4f20\u9012\u7ed9application(\u5373\uff1adjango.contrib.staticfiles.handlers.StaticFilesHandler)\u3002<\/p>\n<p>\u5173\u952e\u4ee3\u78014\uff1ahttpd.serve.forever()\u542f\u52a8\u975e\u5835\u585e\u7f51\u7edc\u76d1\u542c\u670d\u52a1\u3002<\/p>\n<pre><code>\u603b\u7ed3\uff1a\u7efc\u4e0a\u6240\u8ff0\u5176\u5b9e\u90fd\u662f\u5728\u4e3a\u542f\u52a8django\u670d\u52a1\u800c\u505a\u51c6\u5907\uff0c\u5927\u81f4\u5185\u5bb9\u5982\u4e0b<\/code><\/pre>\n<h1>1\u3001\u89e3\u6790\u8fd0\u884c python manage.py \u6240\u63d0\u4f9b\u7684\u53c2\u6570\uff0c\u4f8b\u5982: runserver.<\/h1>\n<h1>2\u3001\u6839\u636e\u53c2\u6570 \u627e\u5230\u76f8\u5bf9\u5e94\u7684 \u547d\u4ee4\u7ba1\u7406\u5de5\u5177\u3002<\/h1>\n<h1>3\u3001\u52a0\u8f7d\u6240\u6709\u7684app\u3002<\/h1>\n<h1>4\u3001\u68c0\u67e5\u7aef\u53e3\u3001ipv4\u68c0\u6d4b\u3001ipv6\u68c0\u6d4b\u3001\u7aef\u53e3\u662f\u5426\u5360\u7528\u3001\u7ebf\u7a0b\u68c0\u67e5\u3001orm\u5bf9\u8c61\u68c0\u67e5(\u8868\u662f\u5426\u521b\u5efa)\u3002<\/h1>\n<h1>5\u3001\u5b9e\u4f8b\u5316WSGIRequestHandler\uff0c\u5e76\u4e14\u5c06\u5b83\u6ce8\u518c\u5230python Lib\u5e93\u4e2d\u7684WSGIServer\u4e2d\u3002<\/h1>\n<h1>6\u3001\u6700\u540e\u542f\u52a8python Lib\u5e93\u4e2d\u7684WSGIServer<\/h1>\n<p>\u4e09 httpd.serve.forever()\u540e\u7eed\u4e8b\u5b9c<\/p>\n<pre><code>\u627f\u63a5\u4e0a\u4e00\u5c0f\u8282httpd.serve_forever\u6211\u4eec\u63a5\u7740\u804a\uff0chttpd.serve_forever\u8c03\u7528\u7684\u662fsocketserver.BaseServer.serve_forever\u65b9\u6cd5(\u5173\u4e8esocketserver\u7684\u6e90\u7801\u89e3\u6790\u70b9\u51fb\u8fd9\u91cc\uff0c\u4e0b\u9762\u6211\u76f4\u63a5\u8bf4\u6d41\u7a0b\uff0c\u539f\u7406\u4e0d\u518d\u7d2f\u8ff0)\u3002<\/code><\/pre>\n<h1>1\u3001socketserver.BaseServer.serve_forever\u65b9\u6cd5\u91c7\u7528\u4e86selector\u7f51\u7edc\u6a21\u578b\u8fdb\u884c\u7b49\u5f85\u6570\u636e\uff0c\u6bcf0.5\u79d2\u904d\u5386\u4e00\u6b21\u6587\u4ef6\u63cf\u8ff0\u7b26\uff0c\u5f53\u6709\u6570\u636e\u8fdb\u6765\u65f6\uff0cready\u53d8\u91cf\u4f1a\u662f\u4e00\u4e2asocket\u8bf7\u6c42\u5bf9\u8c61\uff0c\u8fd9\u65f6\u4f1a\u5c06\u540e\u7eed\u5de5\u4f5c\u8f6c\u4ea4\u7ed9self._handler_request_noblock\u65b9\u6cd5(\u5373\uff1asocketserver.BaseServer._handler_request_noblock)\u53bb\u5904\u7406\u3002<\/h1>\n<h1>2\u3001socketserver.BaseServer._handler_request_noblock\u65b9\u6cd5\u57fa\u672c\u6ca1\u505a\u4ec0\u4e48\u4e8b\u60c5(self.verify_request\u538b\u6839\u5c31\u6ca1\u6709\u68c0\u67e5\u4efb\u4f55\u4e1c\u897f)\uff0c\u76f4\u63a5\u5c31\u628a\u540e\u7eed\u5de5\u4f5c\u8f6c\u4ea4\u7ed9 socketserver.BaseServer.process_request \u65b9\u6cd5\u3002<\/h1>\n<h1>3\u3001socketserver.BaseServer.process_request\u4e5f\u6ca1\u505a\u4ec0\u4e48\u4e8b\u60c5\uff0c\u76f4\u63a5\u5c31\u5c06\u540e\u7eed\u5de5\u4f5c\u8f6c\u4ea4\u7ed9socketserver.BaseServer.finish_request\u65b9\u6cd5\uff0c\u53ea\u4e0d\u8fc7\u5728\u6700\u540e\u52a0\u4e86\u4e00\u6761\u5173\u95ed\u8bf7\u6c42\u7684\u547d\u4ee4\u3002<\/h1>\n<h1>4\u3001socketserver.BaseServer.finish_request\u4e5f\u6ca1\u505a\u4ec0\u4e48\u4e8b\u60c5\uff0c\u76f4\u63a5\u5c31\u5c06\u540e\u7eed\u5de5\u4f5c\u8f6c\u4ea4\u7ed9socketserver.BaseServer.RequestHandlerClass\u3002<\/h1>\n<h1>5\u3001socketserver.BaseServer.RequestHandlerClass\u662f\u7531\u4e0a\u4e00\u8282httpd = httpd_cls(server_address, WSGIRequestHandler, ipv6=ipv6)\u4f20\u9012\u8fc7\u6765\u7684\u53c2\u6570django.core.servers.basehttp.WSGIRequestHandler\u3002 \u4e5f\u5c31\u662f\u8bf4\u5f53\u6267\u884cself.RequestHandler(request, client_address, self)\u65f6\u7b49\u540c\u4e8e\u6267\u884cdjango.core.servers.basehttp.WSGIRequestHandler(request, client_address, self)\u3002<\/h1>\n<pre><code>serve_forever\u5c31\u662f\u5f00\u542f\u4e86\u4e00\u4e2awhile\u6765\u65e0\u9650\u76d1\u542c\u7f51\u7edc\u5c42\u7684scoket\u8bf7\u6c42\uff0c\u5f53\u4e00\u6761\u8bf7\u6c42\u8fc7\u6765\u65f6\uff0c\u5c31\u5c42\u5c42\u8f6c\u4ea4\u5230django.core.servers.basehttp.WSGIRequestHandler\u4ee3\u7801\u5982\u4e0b<\/code><\/pre>\n<p>class WSGIRequestHandler(simple_server.WSGIRequestHandler):<br \/>\nprotocol_version = &#8216;HTTP\/1.1&#8217;<\/p>\n<pre><code>def address_string(self):\n    return self.client_address[0]\n\ndef log_message(self, format, *args):\n    extra = {\n        'request': self.request,\n        'server_time': self.log_date_time_string(),\n    }\n    if args[1][0] == '4':\n        if args[0].startswith('\\x16\\x03'):\n            extra['status_code'] = 500\n            logger.error(\n                \"You're accessing the development server over HTTPS, but \"\n                \"it only supports HTTP.\\n\", extra=extra,\n            )\n            return\n\n    if args[1].isdigit() and len(args[1]) == 3:\n        status_code = int(args[1])\n        extra['status_code'] = status_code\n\n        if status_code >= 500:\n            level = logger.error\n        elif status_code >= 400:\n            level = logger.warning\n        else:\n            level = logger.info\n    else:\n        level = logger.info\n\n    level(format, *args, extra=extra)\n\ndef get_environ(self):\n    for k in self.headers:\n        if '_' in k:\n            del self.headers[k]\n\n    return super().get_environ()\n\ndef handle(self): # \u5173\u952e\u4ee3\u7801\n    self.close_connection = True\n    self.handle_one_request()\n    while not self.close_connection:\n        self.handle_one_request() \n    try:\n        self.connection.shutdown(socket.SHUT_WR)\n    except (socket.error, AttributeError):\n        pass\n\ndef handle_one_request(self): \n    \"\"\"Copy of WSGIRequestHandler.handle() but with different ServerHandler\"\"\"\n    self.raw_requestline = self.rfile.readline(65537)\n    if len(self.raw_requestline) > 65536:\n        self.requestline = ''\n        self.request_version = ''\n        self.command = ''\n        self.send_error(414)\n        return\n\n    if not self.parse_request(): \n        return\n\n    handler = ServerHandler(\n        self.rfile, self.wfile, self.get_stderr(), self.get_environ()\n    )\n    handler.request_handler = self     \n    handler.run(self.server.get_app())\n\n    \u5173\u952e\u4ee3\u7801\uff1a\u65b9\u6cd5handle\uff0c\u81f3\u4e8e\u5982\u4f55\u8c03\u7528\u5230\u5b83\uff0c\u9700\u8981\u4eceWSGIRequestHandler\u7684\u5b9e\u4f8b\u5316\u8bf4\u8d77\uff0c\u4e0a\u9762\u6211\u4eec\u63d0\u5230\u5f53\u6267\u884cself.RequestHandler(request, client_address, self)\u65f6\u7b49\u540c\u4e8e\u6267\u884cdjango.core.servers.basehttp.WSGIRequestHandler(request, client_address, self)\uff0c\u800cWSGIRequestHandler\u7684\u7ee7\u627f\u7684\u7236\u7c7b\u4eec\u5982\u4e0b<\/code><\/pre>\n<h1>1\u3001django.core.servers.basehttp.WSGIRequestHandler<\/h1>\n<h1>2\u3001wsgiref.simple_server.WSGIRequestHandler<\/h1>\n<h1>3\u3001http.server.BaseHTTPRequestHandler<\/h1>\n<h1>4\u3001socketserver.StreamRequestHandler<\/h1>\n<h1>5\u3001socketserver.BaseRequestHandler<\/h1>\n<h1>6\u3001object<\/h1>\n<pre><code>\u5b9e\u4f8b\u5316\u7c7bWSGIRequestHandler\u65f6\u53d1\u73b0\u5b83\u5e76\u6ca1\u6709__init__\u548c__call__\u65b9\u6cd5\uff0c\u9700\u8981\u53bb\u7236\u7c7b\u4e2d\u627e\uff0c\u6700\u7ec8\u5728socketserver.BaseRequestHandler\u4e2d\u627e\u5230\uff0c\u5b83\u8c03\u7528\u4e86self.hande\u65b9\u6cd5\uff0c\u6ce8\u610fself.handle\u5e76\u4e0d\u662f\u76f4\u63a5\u8c03\u7528BaseRequestHandler\u4e2d\u7684handle\uff0c\u6839\u636e\u5bf9\u8c61\u5c5e\u6027\u7684\u67e5\u627e\u5173\u7cfb\uff0c\u4f1a\u53bbdjango.core.servers.basehttp.WSGIRequestHandler\u7c7b\u4e2d\u627e\uff0c\u627e\u5230\u4e86handle\uff0c\u5176\u5b9e\u662f\u76f8\u5f53\u4e8e\u56de\u8c03\u4e86handle\uff0c\u4ee3\u7801\u5982\u4e0b\n\ndef handle(self):\n    self.close_connection = True\n    self.handle_one_request()\n    while not self.close_connection:\n        self.handle_one_request() # \u5173\u952e\u4ee3\u7801\n    try:\n        self.connection.shutdown(socket.SHUT_WR)\n    except (socket.error, AttributeError):\n        pass\n\n \u5173\u952e\u4ee3\u7801\uff1aself.handle_one_request()\u76f4\u63a5\u5728\u5f53\u524d\u7c7b\u4e2d\u627e\u5230\uff0c\u4ee3\u7801\u5982\u4e0b\n\ndef handle_one_request(self):\n    \"\"\"Copy of WSGIRequestHandler.handle() but with different ServerHandler\"\"\"\n    self.raw_requestline = self.rfile.readline(65537)\n    if len(self.raw_requestline) > 65536:\n        self.requestline = ''\n        self.request_version = ''\n        self.command = ''\n        self.send_error(414)\n        return\n\n    if not self.parse_request():  \n        return\n\n    # \u5173\u952e\u4ee3\u78011\n    handler = ServerHandler(\n        self.rfile, self.wfile, self.get_stderr(), self.get_environ()\n    )\n    # \u5173\u952e\u4ee3\u78012\n    handler.request_handler = self      \n    handler.run(self.server.get_app())\n\n\u5173\u952e\u4ee3\u78011\uff1a\u5b9e\u4f8b\u5316\u4e86ServerHandler\u5bf9\u8c61\u3002\n\n\u5173\u952e\u4ee3\u78012\uff1a\u610f\u601d\u662f\u5c06django.contrib.staticfiles.handlers.StaticFilesHandler\u8f6c\u4ea4\u7ed9ServerHandler\u53bb\u8fd0\u884c\uff0c\u800cServerHandler\u5bf9\u8c61\u5e76\u6ca1\u6709run\u65b9\u6cd5\uff0c\u53bb\u5b83\u7684\u7236\u7c7b\u4eec\u4e2d\u53bb\u627e\uff0c<\/code><\/pre>\n<h1>1\u3001django.core.servers.basehttp.ServerHandler<\/h1>\n<h1>2\u3001wsgiref.simple_server.ServerHandler<\/h1>\n<h1>3\u3001wsgiref.handlers.SimpleHandler<\/h1>\n<h1>4\u3001wsgiref.handlers.BaseHandler # \u5728\u6b64\u5904\u627e\u5230run\u65b9\u6cd5<\/h1>\n<h1>5\u3001object<\/h1>\n<pre><code> \u6700\u7ec8\u5728 wsgiref.handlers.BaseHandler \u4e2d\u627e\u5230\u4e86run\u65b9\u6cd5\uff0c\u4ee3\u7801\u5982\u4e0b<\/code><\/pre>\n<p>class BaseHandler:<br \/>\n&#8230;&#8230;&#8230;&#8230;<\/p>\n<pre><code>def run(self, application):\n    try:\n        self.setup_environ()\n        self.result = application(self.environ, self.start_response) # \u5173\u952e\u4ee3\u7801\n        self.finish_response()\n    except:\n        try:\n            self.handle_error()\n        except:\n            self.close()\n            raise  \n\n\u5173\u952e\u4ee3\u7801\uff1aapplication(self.environ, self.start_response)\u4e5f\u5c31\u76f8\u5f53\u4e8e\u662fdjango.contrib.staticfiles.handlers.StaticFilesHandler.__call__(self.environ, lf.start_response)\u3002<\/code><\/pre>\n<p>class StaticFilesHandler(WSGIHandler): # django\u4e13\u95e8\u7528\u6765\u5904\u7406\u9759\u6001\u6587\u4ef6\u7684\u7c7b<br \/>\n&quot;&quot;&quot;<br \/>\nWSGI middleware that intercepts calls to the static files directory, as<br \/>\ndefined by the STATIC_URL setting, and serves those files.<br \/>\n&quot;&quot;&quot;<\/p>\n<h1>May be used to differentiate between handler types (e.g. in a<\/h1>\n<pre><code># request_finished signal)\nhandles_files = True\n\ndef __init__(self, application):\n    self.application = application\n    self.base_url = urlparse(self.get_base_url())\n    super().__init__()\n\ndef load_middleware(self):\n    # Middleware are already loaded for self.application; no need to reload\n    # them for self.\n    pass\n\ndef get_base_url(self):\n    utils.check_settings()\n    return settings.STATIC_URL\n\ndef _should_handle(self, path):\n    \"\"\"\n    Check if the path should be handled. Ignore the path if:\n    * the host is provided as part of the base_url\n    * the request's path isn't under the media path (or equal)\n    \"\"\"\n    return path.startswith(self.base_url[2]) and not self.base_url[1]\n\ndef file_path(self, url):\n    \"\"\"\n    Return the relative path to the media file on disk for the given URL.\n    \"\"\"\n    relative_url = url[len(self.base_url[2]):]\n    return url2pathname(relative_url)\n\ndef serve(self, request):\n    \"\"\"Serve the request path.\"\"\"\n    return serve(request, self.file_path(request.path), insecure=True)\n\ndef get_response(self, request):\n    from django.http import Http404\n\n    if self._should_handle(request.path):\n        try:\n            return self.serve(request)\n        except Http404 as e:\n            return response_for_exception(request, e)\n    return super().get_response(request)\n\ndef __call__(self, environ, start_response):\n    if not self._should_handle(get_path_info(environ)):\n        return self.application(environ, start_response) # \u5173\u952e\u4ee3\u78011\n    return super().__call__(environ, start_response)\n\n \u5173\u952e\u4ee3\u78011\uff1aself.application(environ, start_response) \uff0c\u5148\u8bf4self.application\u662f\u4e2a\u5565\u5462\uff0c\u53ef\u4ee5\u770b\u5230\u5728\u8be5\u7c7b\u7684__init__\u65b9\u6cd5\u4e2d\u6267\u884c\u4e86\u4e00\u4e2aself.application = application\uff0c\u90a3\u5b83\u7684\u503c\u5230\u5e95\u662f\u5565\u5462\uff1f\uff1f\uff1f\n\n \u6559\u4f60\u4e00\u62db\uff0c\u6e90\u7801\u8bfb\u5230\u8fd9\u91cc\uff0c\u4e0d\u5fc5\u518d\u56de\u5934\uff0c\u8bfb\u6e90\u7801\u7684\u7a8d\u95e8\u5728\u4e8e\u8bfb\u4e00\u70b9\u8bb0\u5f55\u4e00\u70b9\uff0c\u9047\u5230\u770b\u4e0d\u61c2\u7684\u53d8\u91cf\u6253\u5370\u4e00\u4e0b\u503c\u770b\u4e00\u4e0b\u5373\u53ef\uff0c\u6700\u597d\u4e0d\u8981\u91cd\u590d\u56de\u5934\uff0c\u90a3\u6837\u53ea\u4f1a\u8ba9\u4f60\u66f4\u6655\uff0c\u4f8b\u5982\u6211\u4eec\u7528\u7ba1\u7406\u7528\u6237\uff08\u4fee\u6539django\u6e90\u7801\u9700\u8981\u6743\u9650\uff09\u4fee\u6539\u6587\u4ef6django.contrib.staticfiles.handlers.StaticFilesHandler\u52a0\u4e00\u884c\u6253\u5370\u4ee3\u7801\uff0c\n\ndef __init__(self, application):\n    self.application = application\n    print('django\u6e90\u7801\u6253\u5370--->self.application\u503c\u4e3a',self.application) # \u6253\u5370\n    self.base_url = urlparse(self.get_base_url())\n    super().__init__()\n\n\u7136\u540e\u91cd\u542fdjango\u53ef\u4ee5\u770b\u5230self.application\u7684\u503c\u4e3a<django.core.handlers.wsgi.WSGIHandler object at 0x106cf0278>\uff0c\u53bb\u67e5\u770b\u7c7bdjango.core.handlers.wsgi.WSGIHandler \u7684\u5b9e\u4f8b\u5316\u53d1\u73b0\u52a0\u8f7d\u4e86\u4e2d\u95f4\u4ef6self.load_middleware(),\u81f3\u6b64\u6211\u4eec\u5b8c\u6210\u5206\u6790\u5982\u4f55\u4ecewsgi\u670d\u52a1\u5230\u5c06url\u8bf7\u6c42\u4fe1\u606f\u8f6c\u4ea4\u7ed9django\uff0c\u5269\u4e0b\u7684\u5c31\u662fdjango\u7684\u5185\u90e8\u6d41\u7a0b\u5566\uff0c\u6211\u4eec\u6709\u673a\u4f1a\u518d\u7ee7\u7eed\u5256\u6790\u5427\n\n\u53e6\u5916\u8865\u5145\uff1a\u53ef\u4ee5\u7528\u540c\u6837\u7684\u624b\u6cd5\u67e5\u770benvion\u53d8\u91cf\uff0c\u8be5\u53d8\u91cf\u975e\u5e38\u91cd\u8981\uff0chttp\u534f\u8bae\u7684\u8bf7\u6c42\u4fe1\u606f\u90fd\u88ab\u653e\u5165\u4e86environ\u53d8\u91cf\u4e2d\u3002\u6211\u4eec\u5206\u6790\u6d41\u7a0b\u4e2d\u7684WSGIServer\u7c7b\u4e3b\u8981\u7528\u4e8e\u5904\u7406socket\u8bf7\u6c42\u548c\u5bf9\u63a5WSGIRequestHandler\uff0cWSGIRequestHandler\u7c7b\u4e3b\u8981\u9488\u5bf9environ\u8fdb\u884c\u9884\u5904\u7406\u548c\u5bf9\u63a5WSGIServerHandler\uff0c\u800cServerHandler\u7c7b\u5219\u4e3b\u8981\u7528\u4e8e\u6267\u884c\u5e94\u7528\u7a0b\u5e8f(application)\u548c\u8fd4\u56de\u54cd\u5e94\u7ed9WSGIServer\uff0cOK\u6211\u8bf4\u5b8c\u4e86\uff0c\u53bb\u4f60\u9ebb\u75f9\u7684\u6e90\u7801\u5206\u6790\uff0c\u5c41\u7528\u6ca1\u6709<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00 \u524d\u8a00 \u597d\u591a\u4eba\u5bf9\u6280\u672f\u7684\u7406\u89e3\u90fd\u505c\u7559\u5728\u61c2\u5f97\u4f7f\u7528\u5373\u53ef\uff0c\u56e0\u800c\u53ea\u4f1a\u7528\u800c\u4e0d\u4f1a\u7075\u6d3b\u7528\uff0c\u4fd7\u8bdd\u8bf4\u597d\u5947\u5bb3\u6b7b\u732b\uff0c\u4e0d\u7136\u6211\u4e5f\u4e0d\u4f1a\u5728\u51cc\u6668 [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":5860,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[385,393],"tags":[],"_links":{"self":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/posts\/5862"}],"collection":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=5862"}],"version-history":[{"count":0,"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/posts\/5862\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=\/wp\/v2\/media\/5860"}],"wp:attachment":[{"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=5862"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=5862"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/egonlin.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=5862"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}