Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 让django 1.10 API在调试中提供静态HTML内容的正确方法是什么?_Python_Django_Python 2.7 - Fatal编程技术网

Python 让django 1.10 API在调试中提供静态HTML内容的正确方法是什么?

Python 让django 1.10 API在调试中提供静态HTML内容的正确方法是什么?,python,django,python-2.7,Python,Django,Python 2.7,我试图构建一个简单的单页web应用程序,其中web服务器只提供静态内容,除非路由以“/api”开头,在这种情况下,请求被路由到django 文件结构如下: 根 -manage.py -静态/(静态内容) -index.html -app.min.js -…等等 -djangoapp/(django“项目”) -_uuuinit_uuuuu.py -设置.py -url.py -wsgi.py -api/(django“应用程序”) -_uuuinit_uuuuu.py -管理员 -apps.p

我试图构建一个简单的单页web应用程序,其中web服务器只提供静态内容,除非路由以“/api”开头,在这种情况下,请求被路由到django

文件结构如下:


根
-manage.py
-静态/(静态内容)
-index.html
-app.min.js
-…等等
-djangoapp/(django“项目”)
-_uuuinit_uuuuu.py
-设置.py
-url.py
-wsgi.py
-api/(django“应用程序”)
-_uuuinit_uuuuu.py
-管理员
-apps.py
-models.py
-tests.py
-views.py

在开发过程中(DEBUG=true),我希望django像传统web服务器一样提供静态内容。这意味着不在/api下的内容应该只从/static提供,而“/”的GET应该返回index.html

我已采取以下步骤:

  • 使用
    django管理启动项目djangoapp
  • 使用
    /manage.py startapp api创建了django“应用程序”
  • 创建了一个静态文件夹,其中包含dummy index.html和dummy.html
  • 修改django“app”以创建一个简单的“hello我是api”端点,位于/api/hello,并创建了相应的路由
  • 从这一点上,我可以成功地设置一个docker compose集群以按预期执行-对nginx边缘的“/”调用加载ROOT/static/index.html中的static index.html,对“/api/hello”的调用被代理到uwgi服务器并相应地返回。但是,我无法让django从其./manage.py运行服务器上执行此操作

    我很快在这里找到了Django自己的指南:

    但是,该文档中列出的建议实际上都不起作用

    背景

    • “静态URL”指向“/”
    • 通过
      os.path.join(BASE\u DIR,“STATIC”)
    …不会以任何方式改变行为-对静态页面(如
    GET/dummy.html
    的请求不会路由

    更改项目的URL.py以包含以下结果时

    django.conf.URL.static.static(settings.static\u URL,document\u root=settings.static\u root)

    …也不会以任何方式改变行为。只有404

    我发现,通过省略STATIC_ROOT值,并将STATICFILES_DIRS值设置为磁盘上的物理文档根,可以成功地服务于静态文件,但会破坏所有其他端点(它们抛出404)

    环境:

    • Debian jessie(稳定)
    • python 2.7.13(通过pyenv安装)
    • django 1.10.6(通过pip安装)

    核心问题似乎围绕着默认安装的应用程序条目django.contrib.staticfiles。解决方案是在settings.py中禁用它


    逐步说明如何构建将在调试模式下提供静态内容的“/api only”django 1.10

  • 安装Python2.7/3.5+和django
  • 使用
    django管理启动项目PROJECTNAME
  • 将cd刻录到PROJECTNAME中,使用
    /manage.py startapp API创建API“app”
  • 使用
    mkdir static
    创建一个staticfiles文件夹,并用传输/捆绑的web客户端填充它
  • 打开PROJECTNAME/settings.py,并更改以下设置:
    • 从已安装的应用程序数组中删除条目:
      django.contrib.staticfiles
    • 在TEMPLATES.DIRS数组中添加一个条目:
      os.path.join(BASE\u DIR,“static”)
    • 将静态URL更改为
      静态URL='/'
    • 将STATIC\u ROOT更改为
      STATIC\u ROOT=os.path.join(BASE\u DIR,“STATIC”)
  • 使用以下步骤路由api应用程序的端点
  • 在“API/views.py”中创建一个概念验证API端点,如下所示

    从django.http导入HttpResponse
    def你好(请求):
    返回HttpResponse(“{”响应“:“你好,我是API!”}”,“应用程序/json”)
    
    …并在api/URL.py中设置api应用程序的内部路由,如下所示:

    从django.conf.url导入url
    从…起导入视图
    URL模式=[
    url(r“^hello$”,views.hello,name='hello'),
    ]
    
    通过编辑PROJECTNAME/url.py将api应用程序添加到项目的url结构中,如下所示:

    从django.conf.url导入包括,url
    从django.contrib导入管理
    URL模式=[
    url(r“^api/”,包括('api.url'),
    url(r“^admin/”,admin.site.url),
    ]
    
  • 通过更改PROJECTNAME/URL.py,为静态内容添加仅调试路由,如下所示:
  • 导入操作系统
    从django.conf导入设置
    从django.conf.url导入包括
    从django.conf.url.static导入静态
    从django.contrib导入管理
    URL模式=[
    url(r“^api/”,包括('api.url'),
    url(r“^admin/”,admin.site.url),
    ]
    如果设置为.DEBUG:
    从django.views.generic.base导入模板视图
    urlpatterns+=[url(r'^$',TemplateView.as_view(template_name='index.html'))]
    urlpatterns+=静态(settings.static\u URL,document\u root=settings.static\u root,show\u index=True)
    
    …您现在应该能够使用
    manage.py runserver
    在“开发模式”下运行django站点,并让django为您的静态内容提供服务。在生产环境中(DEBUG!=True),这些内容都不会被提供,因为应该由专门提供静态内容的web服务器来处理

    • 访问将按预期返回index.html
    • 访问返回预期的somefile.html
    • 访问按预期返回“hello”api端点的响应

    核心问题似乎围绕着默认安装的应用程序条目django.contrib.staticfiles。解决方案是在settings.py中禁用它


    逐步说明如何构建将在调试模式下提供静态内容的“/api only”django 1.10

  • 安装Python2.7/3.5+和django
  • 使用
    django-admi创建一个新的django项目