19

データを検証して元のルートにリダイレクトするルートにフォームを送信しようとしています。

例えば:

  • ユーザーがページ website.com/post を読み込む
  • フォームはデータを website.com/post-save に POST します
  • ユーザーは website.com/post にリダイレクトされます

Pyramid は、これを行う際にいくつかの問題を引き起こしています。

これが私のスリム化されたviews.pyです

def _get_link_form(post_data):
    """ Returns the initialised form object """

    return LinkForm(post_data)

def home_page(request):

    form = _get_link_form(request.POST)
    return {'form' : form}

def save_post(request):
    """ form data is submitted here """"

    form = _get_link_form(request.POST)

    if not form.validate():
        return home_page(request, form)

これは私が遊んでいたコードです。機能しないだけでなく、ごちゃごちゃしてハッキングされたように感じます。Pyramid で「POST 後にリダイレクトする」もっと簡単な方法はありますか?

4

6 に答える 6

27

問題は、フォームが表示されているのと同じURLにPOSTし、POSTが成功したときにユーザーをページからリダイレクトするだけで最も簡単に解決できます。そうすれば、フォームが正常に送信されるまで、URLを変更しません。

別のURLにPOSTしたいだけの場合は、明らかにリクエスト間でフォームデータを処理しているため、セッションを使用してデータを保存する必要があります。

通常、フォームのエラーを処理できるようにする場合は、セッションとフラッシュメッセージを使用します。これを行うには、ベーステンプレートにフラッシュメッセージを表示する場所を追加し、pyramid_beakerなどを使用してセッションサポートを設定するだけです。

ホームページが「home」named-routeに設定されていると仮定します。

from pyramid.httpexceptions import HTTPFound

def myview(request):
    user = '<default user field value>'
    if 'submit' in request.POST:
        user = request.POST.get('user')
        # validate your form data
        if <form validates successfully>:
            request.session.flash('Form was submitted successfully.')

            url = request.route_url('home') 
            return HTTPFound(location=url)
    return {
        # globals for rendering your form
        'user': user,
    }

フォームの検証に失敗した場合、最初にフォームをレンダリングしたのと同じコードを使用し、成功した場合にのみリダイレクトすることに注意してください。この形式では、送信に使用された値とデフォルト値をフォームに入力することもできます。

request.session.peek_flash()とを使用して、選択したテンプレートのフラッシュメッセージをループできますrequest.session.pop_flash()

route_urlホームページビューにフラグを立ててセッションデータを確認する場合は、生成されたURLのクエリ文字列の変更もサポートします。

明らかに、クエリ文字列のすべてをホームページに戻すことができますが、これはセッションが保護するのに役立つ非常に大きなセキュリティの脆弱性です。

于 2011-04-12T20:19:27.717 に答える
8

Pyramid のドキュメントには、次の例を含む特に重要なセクションがあります。

from pyramid.httpexceptions import HTTPFound

def myview(request):
    return HTTPFound(location='http://example.com')
于 2011-04-10T06:24:01.390 に答える
1

私はこれを次のようにします:

from pyramid.httpexceptions import HTTPCreated

response = HTTPCreated()
response.location = self.request.resource_url( newResource )
return response

これにより、HTTP 作成コード 201 が送信されます

于 2011-04-15T11:39:05.127 に答える
1

Pyramid のドキュメントにはRedirectに関するコンテンツが含まれています。詳細については、以下のリンクを参照してください。

ピラミッドのドキュメント

import pyramid.httpexceptions as exc
raise exc.HTTPFound(request.route_url("section1"))   # Redirect

編集: 実際には、Javascript を使用してクライアント側でそれを行うことができます。最初に、特定の応答をクライアント側に送信する必要があります (データをフラッシュするか、応答オブジェクトを返します):

window.location = '{{ request.route_path("route_name") }}';
于 2016-12-02T21:10:23.533 に答える
0

ホームページがピラミッド Web アプリのデフォルト ビューであると仮定すると、次のことができます。

def _get_link_form(post_data):
    """ Returns the initialised form object """

    return LinkForm(post_data)

def home_page(request):

    form = _get_link_form(request.POST)
    return {'form' : form}

def save_post(request):   
    form = _get_link_form(request.POST)

    if not form.validate():
        from pyramid.httpexceptions import HTTPFound
        return HTTPFound(location=request.application_url)

基本的に、home_page ビューがどのようにコンフィギュレーターに「追加」されたかを知る必要があります。ホームページが実際に /few/levels/deep/homepage にある場合、リダイレクトは次のようになります。

        return HTTPFound(location=request.application_url + '/few/levels/deep/homepage')
于 2011-04-12T14:20:15.843 に答える
0

クリーンな方法は、さまざまなリクエスト タイプに対してピラミッドによって提供される「オーバーロード」を使用することです。たとえば、次のようにメソッドを装飾できます。

@action(request_method='GET',
        renderer='mypackage:/templates/save.mako',
        name='save')
def save(request):
    ''' Fill the template with default values or leave it blank'''
     return {}


@action(request_method='POST',
        renderer='mypackage:/templates/save.mako',
        name='save')
def save_post(request):
    """ form data is submitted here """"
    # process form

HTML では、次のようにアクション フォームを呼び出す必要があります。

<form method="POST" id="tform" action="${request.route_url('home', action='save')}">

このように、1 つのメソッドは POST メソッドが使用されたときに処理され、もう 1 つのメソッドは GET が使用されたときに処理されます。同じ名前ですが、2 つの実装があります。

于 2012-04-09T13:46:22.650 に答える