我希望从我的一个视图中将静态文件的内容作为(有时)HttpResponse 返回。
在 Django 中是否有一种简单的方法可以做到这一点?
如果视图有时会使用模板或任何其他计算进行某些操作,那么最好的方法是在您需要返回静态对象时确定“有时”,然后发出临时重定向到该静态 url - 然后离开为您的静态内容提供服务的服务器负责交付内容。
更新
由于我有一段时间没有使用 Django,只是一般地使用 Web 开发等......我被告知 1.3+ 的 Django 包含一个(看起来像)非常简单的重定向机制。(反正比我记得的要简单!)
https://docs.djangoproject.com/en/dev/topics/class-based-views/ 由 Tadeck 提供
我真的很喜欢 Jon Clement 的想法。虽然如果您需要,这就是您提供文件的方式:
def view(request):
with open(path) as file:
response = HttpResponse(file.read(), content_type='application/pdf')
response['Content-Disposition'] = 'attachment; filename=filename.pdf'
return response
除了其他人所展示的之外,还有一种方法有时用于返回对以下请求的响应robots.txt
:
在views.py
:
from django.views.generic import TemplateView
class RobotsTxtView(TemplateView):
"""A class-based view for responding to requests for robots.txt file
"""
template_name = 'robots.txt'
def render_to_response(self, context, **kwargs):
"""Overwritten render_to_response for applying text/html mimetype
"""
return super(RobotsTxtView, self).render_to_response(context,
content_type='text/plain', **kwargs)
当您需要视图时(例如,在内部urls.py
或尝试生成实际视图时),请使用:
from myapp.views import RobotsTxtView
robots_view = RobotsTxtView.as_view()
在robots.txt
模板中的文件中,您实际上可以拥有静态内容(或您喜欢的任何内容)。
但总的来说,其他人是对的:如果您提供静态内容,请将其作为静态内容提供,如果不需要,请不要使用 Django 处理此文件。
return HttpResponse("any content")
会做伎俩吗?或者我误解了你的问题