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

时间:2013-08-01 08:51:57

标签: django django-views django-staticfiles

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

http://127.0.0.1:8000/index.html

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

http://127.0.0.1:8000/

我写了一个视图并且有效:

class IndexView(TemplateView):
    template_name = 'index.html'

我还添加到了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
        }),

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

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

修改

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

5 个答案:

答案 0 :(得分:47)

您可以按照以下方式为static/index.html提供服务:

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

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

<强>更新

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

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

  1. 运行客户端应用来源观察程序以重建脚本/样式/模板(brunch watchgrunt作业或gulp观看任务)
  2. 使用django收集静态以进行制作
  3. 确保你有urlpatterns修复开发和正确的nginx配置生产
  4. 这是我的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'),
    )
    

答案 1 :(得分:39)

在这种情况下,您不需要继承TemplateView。只要TemplateView位于您的模板目录中,您就可以直接在您的网址中使用index.html

from django.views.generic.base import TemplateView

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

答案 2 :(得分:1)

将静态HTML文件包装在模板化HTML文件中定义的iframe中。通过一些样式调整可以使iframe 100%宽度和高度。

{% load static %}
<html>
    <head>
        <title>Templated HTML</title>

        <style>
            html, body {
                width: 100%;
                width: 100%;
                margin: 0;
                padding: 0;
                border-width: 0;
            }

            iframe {
                position: absolute;
                top: 0;
                left: 0;
                width: 100vw;
                height: 100vh;
                margin: 0;
                padding: 0;
                border-width: 0;
            }
        </style>
    </head>
    <body>
        {{ content }}
        <iframe src="{% static 'main/html/test.html' %}"></iframe>
    </body>
</html>

答案 3 :(得分:0)

查看我在this answer /上{或blog post/static/提供 index.html 的详细说明。但是,如果你想拥有一个由Django提供服务的完整SPA(因为你需要前端路由),那么这个解决方案可能还不够。

我一直在使用不同的方法将/路由到orWhere,将所有请求转发到前端,找到 index.html 文件。最后我发现解决所有问题的最佳方法不是通过调整 urls.py ,而是作为我发布为django-spa的WhiteNoise的扩展(README中的安装说明)

您可以在此WhiteNoise issue找到一些相关的讨论。

答案 4 :(得分:0)

你可以创建模板目录,把html放在那里然后从views.py

渲染它
    def index(request):
        return render(request, 'my_app/index.html', context={})

别忘了在settings.py

中设置templates_dir
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
TEMPLATES_DIR = os.path.join(BASE_DIR, "templates")

TEMPLATES = [
{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [TEMPLATES_DIR,],
    'APP_DIRS': True,
    ...