50

我的 index.html 在 /static/ 文件夹中。当我尝试时,我的 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 应用程序,所以在正确编码后,我所要做的就是 -->从静态文件夹制作 .zip 并将其作为移动应用程序上传到 Phonegap。简单干净。

4

5 回答 5

54

您可以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 配置

这是我的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'),
)
于 2014-02-16T00:20:00.817 回答
45

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

from django.views.generic.base import TemplateView

urlpatterns = [
    url(r'^$', TemplateView.as_view(template_name='index.html'), name="home"),
]
于 2013-08-01T08:58:00.497 回答
4

只需将静态 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>
于 2018-04-13T22:27:38.393 回答
4

查看我对如何在此答案中提供index.html详细说明(或扩展为博客文章)。但是,如果您想要由 Django 提供完整的 SPA(因为您需要前端路由),那么仅此解决方案可能还不够。/

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

你可以在这个WhiteNoise issue中找到一些相关的讨论。

于 2017-04-08T13:01:30.893 回答
3

您可以创建模板目录,将 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,
    ...
于 2017-09-22T11:45:51.223 回答