0

私はPython Webフレームワークが初めてです。私は web.py を使用しています。returnしかし、キーワードを介して出力を送信するように制限されている場合、ページとスクリプトを効率的に作成するにはどうすればよいでしょうか? 大きな文字列であっても、ブラウザに送信できるのは 1 つのみの python モジュールのようです。サーバー側スクリプトの Python の方法について何が欠けていますか? それが役立つ場合、私はPHPの観点から来ています。print "foo" と言うと foo が表示されることに慣れています。これで、モジュールごとに 1 回だけ印刷できます。スクリプティングへの Python アプローチと php アプローチの方向性を教えていただければ幸いです。この時点で、非常に制限されているにもかかわらず、Pythonが非常に効率的であることに非常に混乱しています。

たとえば、私が書いた基本的なプログラムは次のとおりです。

 import web
 urls = ('/','index')
 class index:
     def GET(self):
         return "foo" ///Where this is the only place on the file I can output anything
 (and the rest of the file you should be familiar with)

ポイントは、何かを出力できる唯一の場所が1つの戻り行にあるように見えるということですか? URI引数が変更された場合、別のクラスにマップして別の方法で出力できることを理解しましたが、それでもこれは制限されているようですか?

それとも最終的に、web.py で呼び出される「テンプレート」を使用する Web フレームワークのポイントですか? 助けてくれてありがとう。

4

2 に答える 2

1

Andrey Kuzminの答えは正解であり、テンプレートが正しい作業方法です。

ただし、phpで返すテキストを生成したい場合は'print( "blah");' ある種の方法で、次のように作業できます。

class index:
    def GET(self):
        output = []
        # do stuff...
        output.append('Some text.')
        # do more stuff...
        output.append('And more text...')
        # ok, now we're at the end:
        return '<br/>'.join(output)

これにより、「出力」リストに追加したすべてのテキストが、HTMLの改行で結合されてブラウザ/クライアントに返されます。

繰り返しになりますが、ほとんどの場合、テンプレートの方が優れた作業方法です。

テンプレートと単一の「リターン」が優れているのはなぜですか?

PHPでは、出力に「印刷」するのは非常に簡単で、便利な場合があります。ただし、次のことを想像してください。

<?php
    include('foobar.php');
    header('Content-Type: Application/JSON');
    print ('{"message": "Hello World!"}');
?>

素晴らしいですよね?問題は、インクルードしようとしているファイル(foobar)にエラーがあると言うことです。これで、PHPエラーメッセージがHTTPヘッダーの前にクライアントに返され、別のPHPエラーが発生し、ページがめちゃくちゃになります。

また、

foob​​ar.phpファイルにはいくつかのprintステートメントが含まれています。繰り返しになりますが、ヘッダーの前にエラーが出力されるか、カスタムヘッダーを実行していない場合でも、無効なドキュメントが表示されます。したがって、PHPでは、解決策は次のようなものです。

<?php
    ob_start(); // start caching all output, so it doesn't interfere.
    include('foobar.php');
    do_other_stuff();
    ob_end_flush(); // print the cached output.
?>

これはややかさばりますが、その問題を防ぎます。これで状況がわかりました。インクルードファイルの1つがob_start()または他の出力キャッシュも使用している場合はどうなりますか?彼らのコードにエラーがない限り、あなたは大丈夫なはずです。ただし、エラーが発生し、フラッシュに到達する前にphpがクラッシュした場合、その情報は失われます。

Pythonのように単一のエンドポイントで作業するということは、返されるものをより細かく制御できることを意味します。いくつかの古いレガシーPHPコードでは、何か(おそらくエラーメッセージ)が出力されることを維持する必要があり、コードベース全体を検索して、印刷された場所を見つける必要がありました。

次に、デバッグメッセージを出力するにはどうすればよいですか?

Pythonには、非常に便利な「ロギング」モジュール(http://docs.python.org/2/howto/logging.html、またはその他のチュートリアルについてはgoogle)があり、すべてのエラーメッセージをファイルに記録できます。複数のファイル。次に、テスト中にそのファイルを「tail -f」し、CSSまたはHTML形式によって混乱したり混乱したりする可能性があるブラウザでファイルを待つのではなく、発生したすべてのエラーまたはデバッグ情報を観察できます。

これはまた、誤ってデバッグメッセージ(機密情報を含む)をブラウザに送信する可能性がはるかに少ないことを意味し、サイトが最終的な本番環境を維持している間に、ログレベル(デバッグ情報のロード、エラーのみなど)を切り替えることができます外観。

import logging
logging.basicConfig(filename='my_application.log', level=logging.DEBUG)
log = logging.getLogger(__name__)

# do stuff....
log.debug('This is a debug message')
# do more stuff
log.error('Oh no! This should not happen!')
# ...

これで、my_application.logというファイルが作成されます。このファイルには、次のようなすべてのエラーメッセージとデバッグメッセージが含まれています。

appname:DEBUG:This is a debug message
appname:ERROR:Oh no! This should not happen!

デバッグメッセージの表示を停止するには、レベルをlogging.DEBUGからlogging.ERROR、またはその他の必要なレベルに変更するだけで、エラーのみが表示されます。リンクされたチュートリアルには、さらに多くの情報があります。

これがお役に立てば幸いです。

于 2013-01-13T05:30:09.247 に答える
1

はい、これがテンプレートの目的です。ロジックをプレゼンテーションから効率的に分離するためです。

コントローラークラスのすべてのデータをクエリしてから、html を出力するテンプレートに渡す必要があります。

これは一般的な php の慣行とは異なるように思えるかもしれませんが、php 開発者でさえこのアプローチを選択していると確信しています。

web.py に関して、コンテンツ出力をストリーミングする別のオプションは、を使用することです。http:yield //webpy.org/cookbook/streaming_large_filesを参照してください。

于 2012-12-29T08:58:30.453 に答える