Django使用'/'url中的视图提供静态index.html

Fea*_*nor 41 django django-views django-staticfiles

我在/ static /文件夹中有我的index.html.我尝试时,我的django应用程序正常运行:

http://127.0.0.1:8000/index.html
Run Code Online (Sandbox Code Playgroud)

但我想通过url访问index.html:

http://127.0.0.1:8000/
Run Code Online (Sandbox Code Playgroud)

我写了一个视图,它的工作原理:

class IndexView(TemplateView):
    template_name = 'index.html'
Run Code Online (Sandbox Code Playgroud)

我还添加到urls.py(这让我像静态一样http://127.0.0.1:8000/css/style.css):

url(r'^(?P<path>.*)$', 'django.contrib.staticfiles.views.serve', {
            'document_root': settings.STATIC_ROOT, 'show_indexes':True
        }),
Run Code Online (Sandbox Code Playgroud)

但我认为有一种方法可以在没有TemplateView的情况下做我想做的事情.

有什么建议?谢谢.我的django版本是:Django 1.5

编辑:

我将index.html放入静态的原因是:我想制作与Phonegap兼容的django应用程序,所以在正确编码后,我所要做的就是 - > 从静态文件夹中生成.zip并将其作为移动应用程序上传到Phonegap.简单干净.

Ant*_*rov 50

您可以static/index.html像这样为开发服务:

if settings.DEBUG:
    urlpatterns += url(
        r'^$', 'django.contrib.staticfiles.views.serve', kwargs={
            'path': 'index.html', 'document_root': settings.STATIC_ROOT}),
Run Code Online (Sandbox Code Playgroud)

但是对于生产,您应该配置您的nginx(或其他前端服务器)index.html/位置提供文件

UPDATE

我想解释你应该这样做的情况.例如,您的django应用程序仅是admin和api视图,但客户端与单个页面应用程序(Ember,Angular,无论如何)进行交互.所以你的项目至少有两个子项目,一个用你的主django应用程序,第二个是一个带有所有html/js/css东西的客户端应用程序.将客户端脚本与django后端分开是非常方便的,它允许你的前端开发人员完成他们的工作并避免django存在(有一天它可以移动到不同的repo).

因此,在这种情况下,您将获得以下构建工作流:

  1. 运行客户端应用程序源观察程序以重建脚本/样式/模板(brunch watch,grunt作业或gulp监视任务)
  2. 用django收集静态用于生产
  3. 确保你有urlpatterns修复开发和正确的nginx配置生产

这是我的urls.py例子

urlpatterns += patterns(
    'django.contrib.staticfiles.views',
    url(r'^(?:index.html)?$', 'serve', kwargs={'path': 'index.html'}),
    url(r'^(?P<path>(?:js|css|img)/.*)$', 'serve'),
)
Run Code Online (Sandbox Code Playgroud)


Ala*_*air 40

TemplateView在这种情况下,您不需要子类.您可以TemplateView直接在您的网址中使用,只要index.html在您的模板目录中即可.

from django.views.generic.base import TemplateView

urlpatterns = [
    url(r'^$', TemplateView.as_view(template_name='index.html'), name="home"),
]
Run Code Online (Sandbox Code Playgroud)

  • @Alasdair你能解释一下为什么不呢?我的意思是每个人都说这个,但他们从不说明原因.如果你正在服务一个SPA,它将整个视图设备运送到一个预先编译的有效载荷中,那么让Django服务它似乎并不是那么糟糕.任何给定的访问者只加载一次.但如果有理由不早于现代SPA架构,我会非常有兴趣知道它们是什么. (8认同)
  • 不要忘记添加`来自django.views.generic import TemplateView` (6认同)
  • [`views.serve`](https://docs.djangoproject.com/en/1.6/ref/contrib/staticfiles/#django.contrib.staticfiles.views.serve)帮助程序仅用于开发.您不应该使用Django在生产中提供静态文件.使用您的Web服务器,例如Apache或Nginx来提供静态文件. (4认同)
  • @npskirk在生产中不使用它的主要原因是安全性,而不是效率。[Django文档中的警告](https://docs.djangoproject.com/en/1.8/ref/contrib/staticfiles/#static-file-development-view)非常明确。 (2认同)
  • 如果设置了正确的缓存头,则@Feuermurmel客户端可以缓存资源。该页面是由Django还是由其他Web服务器提供都没有关系。 (2认同)