我正在尝试从我的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)
答案 0 :(得分:3)
render()
render应该使用django模板名称,而不是完整的文件输入。因此,您可以尝试将生成的文件放在模板路径中(不要将静态目录添加到模板路径中!)并使用模板的相对路径作为参数。
或者您将HTML内容作为文件流加载,并将其返回到内容类型设置为text/html
的常规响应中。
当然,您也可以使用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模式定义。
自动创建正确网址的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取决于生成的内容,您可能需要更精确的逻辑。