当来自 Uvicorn 的 运行 时,Django graphene GraphiQL 页面未加载

Django graphene GraphiQL page not loading when running from Uvicorn

不确定我设置错了什么,但是当 运行 在 uvicorn 中使用 uvicorn mysite.asgi:application:

时我没有得到 graphiql 界面
[32mINFO[0m:     Started server process [[36m14872[0m]
[32mINFO[0m:     Waiting for application startup.
[32mINFO[0m:     ASGI 'lifespan' protocol appears unsupported.
[32mINFO[0m:     Application startup complete.
[32mINFO[0m:     Uvicorn running on [1mhttp://127.0.0.1:8000[0m (Press CTRL+C to quit)
[32mINFO[0m:     127.0.0.1:52463 - "GET /graphql/ HTTP/1.1" 200
Not Found: /static/graphene_django/graphiql.js
[33mWARNING[0m:  Not Found: /static/graphene_django/graphiql.js
[32mINFO[0m:     127.0.0.1:52463 - "GET /static/graphene_django/graphiql.js HTTP/1.1" 404
Not Found: /static/graphene_django/graphiql.js
[33mWARNING[0m:  Not Found: /static/graphene_django/graphiql.js
[32mINFO[0m:     127.0.0.1:52463 - "GET /static/graphene_django/graphiql.js HTTP/1.1" 404

但是当我这样做时它加载正常 python manage.py runserver

这是我安装的:

Python 3.8.2
Django==3.0.5
uvicorn==0.11.3
graphene==2.1.8
graphene-django==2.9.0
graphql-core==2.3.1

在 settings.py 我有:

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_DIRS = [os.path.join(BASE_DIR, "static"),]

# Graphene
GRAPHENE = {
    'SCHEMA': 'mysite.schema.schema'
}

Django 本身不在开发服务器之外提供静态文件,您必须自己以某种方式完成。您可以设置像 nginx 这样的反向代理并指示它为您的 staticfiles 目录中的所有静态文件提供服务,或者,仅用于开发 ,您可以指示 django 为它们提供服务,通过添加到您的 urls.py:

from django.conf import settings
from django.views.static import serve

# Put the line provided below into your `urlpatterns` list.
url(r'^(?P<path>.*)$', serve, {'document_root': settings.STATIC_ROOT})

确保仅在开发时使用后面的方法,因为它可能会对性能产生严重影响。

对于这两种方法,您还必须使用 python manage.py collectstatic 收集静态文件,因为在开发服务器之外的 django 需要将所有静态文件收集在一个地方,您的 STATIC_ROOT.

只需在 settings.py 文件中设置 DEBUG = True。