25

DjangoベースのWebサイトを作成していますが、単純なテキストファイルを提供する必要があります。静的ディレクトリに配置してDjangoをバイパスすることで、これを行う正しい方法はありますか?

4

4 に答える 4

46

ファイルが静的 (django アプリによって生成されたものではない) の場合は、静的ディレクトリに配置できます。

このファイルのコンテンツが Django によって生成されたものである場合は、MIME タイプtext/plainとして HttpResponse で返すことができます。

content = 'any string generated by django'
return HttpResponse(content, content_type='text/plain')

Content-Disposition応答の を設定して、ファイルに名前を付けることもできます。

filename = "my-file.txt"
content = 'any string generated by django'
response = HttpResponse(content, content_type='text/plain')
response['Content-Disposition'] = 'attachment; filename={0}'.format(filename)
return response
于 2013-01-24T13:59:57.947 に答える
9

@luc に同意しますが、別の方法としてX-Accel-Redirectヘッダーを使用することもできます。

大きな保護された (表示するにはログインが必要な) 静的ファイルを提供する必要があると想像してください。ファイルを静的ディレクトリに置くと、アクセスが開かれ、誰でも閲覧できます。ファイルを開いてから提供することでDjangoで提供すると、IOが多すぎて、ファイルをRAMにロードする必要があるため、Djangoはより多くのRAMを使用します。解決策は、データベースに対してユーザーを認証するビューを持つことですが、ファイルを返す代わりに、Django はX-Accel-Redirectその応答にヘッダーを追加します。Django は nginx の背後にあるため、nginx はこのヘッダーを認識し、保護された静的ファイルを提供します。Django と比較して、nginx は静的ファイルの提供においてはるかに優れており、はるかに高速であるため、これははるかに優れています。ここそれを行う方法に関するnginxのドキュメントです。Apache でも同様のことができますが、ヘッダーは覚えていません。

于 2013-01-24T15:18:52.297 に答える
3

AJAX 経由でフォームのテキスト テンプレートを取得するために、同様の要件がありました。次のようなモデル ベースのビュー (Django 1.6.1) で実装することにしました。

from django.http import HttpResponse
from django.views.generic import View
from django.views.generic.detail import SingleObjectMixin

from .models import MyModel

class TextFieldView(SingleObjectMixin, View):
    model = MyModel

    def get(self, request, *args, **kwargs):
        myinstance = self.get_object()
        content = myinstance.render_text_content()
        return HttpResponse(content, content_type='text/plain; charset=utf8')

レンダリングされたテキストは非常に小さく、モデル内の他のフィールドから動的に生成されます。

于 2013-12-28T23:55:00.983 に答える