Django正在下载文件而不是显示它

时间:2017-02-01 14:25:01

标签: html django

我正在尝试从我的Django代码中显示HTML文件。但我的文件正在下载而不是显示。

以下是我的代码:

@api_view(['GET'])

def download_y9cfile1(request, file_name):  

    filePath = CommonUtils.get_absolute_file_path('app', 'static', 'generated', 'HTML' , file_name)
    return render(request, file_name)

1 个答案:

答案 0 :(得分:3)

render()

render应该使用django模板名称,而不是完整的文件输入。因此,您可以尝试将生成的文件放在模板路径中(不要将静态目录添加到模板路径中!)并使用模板的相对路径作为参数。

常规HttpResponse

或者您将HTML内容作为文件流加载,并将其返回到内容类型设置为text/html的常规响应中。

Staticfiles

当然,您也可以使用staticfiles模块以与提供JS和CSS文件相同的方式提供该html文件。加载文件的路径表明您实际上只是想要提供静态资源。这将是Django的方式。

有关静态文件的更多信息(阅读文档也有帮助):

如果这是<project_dir>/<app_dir>/settings/base.py

APP_DIR = os.path.dirname(os.path.realpath(project_module.__file__))
PROJECT_ROOT = os.path.dirname(APP_DIR)

STATIC_URL = '/static/'
STATICFILES_DIRS = (
    # this would contain your "generated" directory
    # you can link several directories here if you'd rather
    # have "generated" as a root directory (url wise)
    os.path.join(APP_DIR, 'static'),
)
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static_collected')

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    # 'compressor.finders.CompressorFinder',
)

在您的最高urls.py

urlpatterns = [
    ...
] + static.static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

if settings.DEBUG:
    urlpatterns += [
        url(r'^static/(?P<path>.*)$', never_cache(serve_static)),
        # url(r'^__debug__/', include(debug_toolbar.urls)),
    ]

在制作时,static_collected最好由Nginx或Apache Http提供。但是,如果您需要为生成的文件提供特殊URL,则可能需要一个明确的视图,以及URL模式定义。

CSS资源/模板解决方案

自动创建正确网址的Django模板示例:

{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'lib/css/jquery-ui.min.css' %}"/>

您可能需要重新考虑将生成的htmls更改为Django模板,以避免在其中包含硬编码的静态URL。例如,您只能生成重要部分,然后在使用超级模板呈现响应时将其包含为上下文变量:

views.py

class GeneratedFileView(TemplateView):
    template_name = 'templates/super_generated_view.html'

    def get_context_data(self, **kwargs):
        gc = ...  # get the generated content here, as string
        return super().get_context_data(generated_content=gc, **kwargs)

其他一切都是TemplateView魔法。

templates/super_generated_view.html

<!doctype html>

{% load static compress %}

<html lang="{{ LANGUAGE_CODE }}">
<head>
    <meta charset="UTF-8"/>
    ..... css and js etc. directives
</head>
<body>
    {{ generated_content }}
</body>

这只是一个简单的例子。如果您需要CSS / JS取决于生成的内容,您可能需要更精确的逻辑。