0

post() および get() メソッドを定義する myClass というクラスがあります。

index.htmlから、データベースからいくつかのデータを取得し、いくつかの変数を設定し、ユーザーをnew.htmlに送信する myClass.post() を呼び出すアクションを含むフォームがあります。

現在、new.htmlには myClass.get() を呼び出すフォームがあります。

post() で取得した変数の値を get() メソッドに知らせたいと思います。それがここでの要点です。

new.html からの送信により、index.html からの送信によって作成された myClass の別のインスタンスが作成されると思います。

どういうわけか「投稿インスタンス」にアクセスする方法はありますか?

これに対する回避策はありますか? 私がしなければならない場合、post から "new.html" に値を送信し、get-submit で送り返す確立された方法はありますか?

より一般的には、Web プログラミング時のインスタンスの寿命を理解していないと思います。通常の対話型環境では、インスタンスがいつ作成され、いつ破棄されるかを知っていますが、そのクラスのメソッドへの呼び出しを通じてのみクラスを使用しているときはわかりません。メソッドが呼び出されない限り、これらのクラスはインスタンス化されますか?

4

6 に答える 6

3

あなたが話しているのは、「セッション」を確立することです。つまり、ユーザーとそのトランザクションの状態を記憶する方法です。

これに取り組む方法はいくつかありますが、そのすべてが、そもそもセッション中であることを思い出すためのテクニックに依存しています。

HTTP は何の助けにもなりません。サーバーでセッション状態を保存する場所と、クライアントでセッション ID を記録する場所を見つける必要があります。2大テクニックは、

  • Cookie を使用してセッションを識別します。シームレスで静か。

  • URL でクエリ文字列を使用して、セッションを識別します。?sessionid=SomeSessionGUIDURL にがあるため、明らかです。これにより、多くの情報が公開され、ブックマークが煩わしくなります。セッションがクリーンアップされた後も、このセッション ID がユーザーのブックマークに残っています。

  • 限られた方法で、非表示フィールドをフォームで使用することもできます。これは、すべてのページにフォームがある場合にのみ機能します。常に正しいとは限りません。

これが実際にどのように機能するかです。

  1. レスポンスを取得します。ヘッダーの Cookie を確認します。

    を。クッキーはありません。初めてのユーザー。セッションを作成します。どこかに保存します (メモリ、ファイル、データベース)。一意の ID を Cookie に入れます。これが初めてであることを認識して返信します。

    b. クッキー。最近ここに来ました。クッキーを取得してみてください。

    • セッション オブジェクトを見つけます。Cookie 内の情報を使用して応答します。

    • ドラット。セッションなし。古いクッキー。新しいものを作成し、これが彼らの最初の訪問であるように振る舞います。

  2. POST 応答。ヘッダーの Cookie を確認します。

    を。クッキーはありません。なんてこと?愚かな子供たち。私の芝生から降りてください!誰かが POST をブックマークしたか、あなたの頭を混乱させようとしています。初めての GET であるかのように応答します。

    b. クッキー。優秀な。クッキーを取得します。

    • セッション オブジェクトを見つけます。セッション オブジェクトで必要なものを見つけます。応答。

    • ドラット。セッションなし。古いクッキー。新しいものを作成し、初めての GET であるかのように応答します。

Cookie の代わりにクエリ文字列を使用して同じことを行うことができます。またはフォームの非表示フィールド。

于 2008-12-11T11:24:44.733 に答える
1

HTTPはステートレスであるため、あるページをロードするユーザーが別のページをロードしたユーザーと同じであるかどうかを知る(組み込みの)方法はありません。さらに、たとえばセッションCookieのおかげで、次のページを読み込んでいるブラウザウィンドウが、前のページを読み込んでいるブラウザウィンドウと同じであるかどうかを判断する方法がありません。複数のタブがサイトにアクセスしていて、あるページの状態を変更して別のページの状態を変更したくない場合。

そのことを念頭に置いて、GETでフェッチされるページへのリンクにクエリパラメータを含め、「get」ページに送信する変数をエンコードするのが最善のオプションです(ユーザーは機密性がないことを確認してください。それらを変更してください!)。次に、getリクエストのself.request.GETを介してそれらにアクセスできます。

于 2008-12-11T09:18:31.447 に答える
1

インスタンスの管理方法の問題ではありません。HTTP はステートレスであるため、プログラムも実質的にステートレスです。(GAE のような長時間実行されるプロセスの場合、別の方法で作成することは可能ですが、ここでこの複雑さが必要になるかどうかはわかりません)

コードを提供していませんが、POST を取得して結果にリダイレクトすると仮定しています (これは GET です)。したがって、パラメーターを保持するのは簡単なはずです。

def save_foo(request):
    if request.method == 'POST':
        save(request.POST)
        return HttpRedirect(reverse(
            'Some_Target',
            {'bar': 'baz', 'foo': request.POST['foo']}))
    else:
        # do something else

このビューは、POST の場合、クライアントがエイリアス化された URL に GET リクエストを発行するようにしますSome_Target。そして、この GET にはfooPOST からのパラメーターが含まれます。

このソリューションは、単一のビュー用です。プロジェクトごとにこの動作が必要な場合は、ミドルウェアを使用できます。今回は、変数をキャッシュすることは理にかなっています。

このアプローチで少し不快に感じる点が 2 つあります。

  1. GET パラメーターと POST パラメーターの混合。GET パラメータは、フィルタリングなどの副作用のない命令に使用する必要があります。POST パラメータは、副作用のある命令、つまりデータの変更に使用する必要があります。パラメータを POST から get に移動することは避けるべきです。
  2. 永続性が必要な場合、通常、オブジェクト インスタンス (または私の例のように関数スコープ) を使用することはお勧めできません。
    1. 保持の必要性cookiesが低く、機密性の低い情報である場合は、進むべき道です。それらはクライアント側での永続化のメカニズムであるため、リクエストから取得するだけで、変更しない限り保持されます (もちろん、有効期限が切れるまで)。
    2. 保持をより詳細に制御する必要がある場合は、ローカル永続化メカニズムを使用する必要があります。サーバーキャッシュ(あらゆる種類の)、ファイルシステム、データベース...そしてもちろん、ユーザーごとに手動でフィルタリングする必要があります。

いずれにせよ、インスタンスでのキャッシュは避けます。

于 2008-12-11T07:12:22.140 に答える
0

memcacheを使用して変数を一時的に保存してから、POST URLにリダイレクトしないのはなぜですか?それが最も簡単な解決策のようです。

于 2008-12-11T09:41:01.467 に答える
0

OK -- みんなありがとう。

これらのアイデアのいくつかをすぐに試して、皆さんに戻ってきます。

データストア*から多くの書き込みと読み取りを行うことでこれらのことを回避できるようですが、クラスのそのインスタンスを保持する簡単な方法があるかもしれないと思いました(私は既知のテクニックを使用しようとしていますまだ完全には取得していない Web フレームワーク)。

*たとえば、POST のデータに基づいて一意のレコードを作成し、いくつかの変数に「タグを付ける」ことができます。これは悪い習慣ですか?

于 2008-12-11T18:02:19.237 に答える
0

Google App Engine については特に知りませんが、通常は次のようになります。

サーバーには、ある種のスレッドプールがあります。HTTP 要求がサーバーに送信されるたびに、プールからスレッドが選択されるか作成されます。

そのスレッドでは、ある種のコントローラ オブジェクトのインスタンスが作成されます。このオブジェクトは、リクエストの処理方法を決定します (他のクラスのインスタンス化や http リクエスト パラメータの前処理など)。通常、このオブジェクトは Web フレームワークのコアです。要求パラメーターも毎回ブラウザーによって再送信されます (サーバーはブラウザーが何を望んでいるかを推測できません)。

通常、Web サーバーには、永続状態またはセッション状態のオブジェクトの状態ストアがあります。セッションは一意のユーザー (通常は URL の Cookie または GUID) によって表され、一定時間後に有効期限が切れます。

あなたの場合、最初の関数から取得した値を取得し、それをセッション ストアに格納し、2 番目の関数でそれらの値をセッション ストアから取得する必要があります。

別の解決策は、最初の関数から生成された HTML の url パラメータとしてアイテムをページに送り返し、2 番目の関数から「通常どおり」それらを取得することです。

于 2008-12-11T04:09:50.213 に答える