【问题标题】:How to return a static HTML file as a response in Django?如何在 Django 中返回静态 HTML 文件作为响应?
【发布时间】:2013-01-02 05:29:46
【问题描述】:

我还没有弄清楚如何使用纯 HTML 代码和/或 HTML + JavaScript + CSS 呈现网站。

我试图加载一个 HTML 文件,上面写着:Hello World

我知道我也可以用 Django 做到这一点,但稍后,我想用 CSS+JavaScript+HTML 显示我的网站。

在视图文件中我运行以下代码:

# Create your views here.
from django.http import HttpResponse
from django.template import Context, loader

def index(request):
    template = loader.get_template("app/index.html")
    return HttpResponse(template.render)

但网站显示的唯一内容是:

【问题讨论】:

  • 在生产环境中,您需要避免使用 Django 来提供静态资源。另外,看看docs.djangoproject.com/en/1.8/howto/static-files。如果您发布的代码是您在添加动态行为之前采取的中间步骤,那是一回事 - 但如果 app/index.html 确实是一个静态 html 页面,那么我认为您应该将其作为静态资产。

标签: python html django static-html


【解决方案1】:

如果您的文件不是 django 模板而是纯 html 文件,这是最简单的方法:

from django.shortcuts import render_to_response

def index (request):
    return render_to_response('app/index.html')

2020 年 10 月 13 日更新:

render_to_response 在 Django 2.0 中被弃用并在 3.0 中被删除,所以目前的做法是:

from django.shortcuts import render

def index (request):
    return render(request, 'app/index.html')

【讨论】:

  • 当我这样做时,浏览器只显示 html 文件的内容,即:

    hello world

  • 自从 Django 3.0 render_to_response 快捷方式被删除。根据stackoverflow.com/a/55911436/7444782 代码return render_to_response('app/index.html') 可以替换为return render(None, 'app/index.html')
【解决方案2】:

你没有在那里调用render 方法,是吗?

比较:

template.render

template.render()

【讨论】:

  • 啊,是的,谢谢,错过语法检查...还有什么我想使用 django+html+javascript+css 时需要注意什么吗??
  • 阅读static 应用程序(内置)和webassets(用于js/css 缩小和缓存破坏。)
【解决方案3】:

如果您的 CSS 和 JS 文件是静态的,请不要使用 Django 来提供它们,或者serve them as static files

对于您的 html,如果它只是一些没有任何动态内容的固定文件,您也可以这样做。您也可以将generic viewsTemplateView 一起使用,只需将这样的一行添加到您的urls.py

    url(r'^path/to/url', TemplateView.as_view(template_name='index.html')),

【讨论】:

  • 这让我可以从 django 启动页面,但 {{}} 模板运算符中的文本没有出现。我在 html 页面中使用 angular js,这与 django 模板 {{ 运算符冲突。我通过使用帖子stackoverflow.com/questions/8302928/… 中的建议解决了这个问题
  • 不要忘记在urls.py中包含from django.views.generic import TemplateView
【解决方案4】:

使用HttpResponse你只能发送数据,如果你想html文件那么你必须使用renderrender_to_response通过以下方式...

from django.shortcuts import render

def index(request):    
    return render(request, 'app/index.html')

from django.shortcuts import render_to_response

def index (request):
    return render_to_response('app/index.html')

【讨论】:

  • 如果你能解释一下HttpResponserender_to_response 之间的区别就好了
【解决方案5】:

首先,您需要对模板进行一些设置:

root 目录 中创建“templates”文件夹,manage.py 在您创建项目后所在的位置。 然后转到 settings.py ,在 TEMPLATES 部分进入模板文件夹的目录。不建议使用硬编码,因为如果您将项目发送给您的朋友,您的朋友将无法运行它。应该是这样的:

TEMPLATES = [
 {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,"templates")],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

假设您有 home.htmlabout.html 在模板文件夹中有:

urls.py

from django.contrib import admin
from django.urls import path
from . import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('about/',views.aboutview),
    path('',views.homeview),
]

views.py

from django.http import HttpResponse
from django.shortcuts import render

def aboutview(request):
  return render(request,"home.html")
def homeview(request):
  return render(request,"about.html")

【讨论】:

    【解决方案6】:
    from django.http import HttpResponse
    
    from django.template import loader
    
    def index(request):
    
        template=loader.get_template('app/index.html')
    
        return HttpResponse(template)
    

    【讨论】:

    • 您的代码与 OP 的代码只有一个小细节不同(template.rendervs.template)。您可能想解释为什么这可以解决 OP 的问题。
    猜你喜欢
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2015-01-16
    • 2021-08-03
    相关资源
    最近更新 更多