1

web2py アプリケーションで書式設定するために HTML フォーム データを Python スクリプトに送信する必要がありますが、その方法がわかりません。ユーザーはデータを HTML フォームに入力します。データはスクリプトに送信され、そこでクリーンアップされてトークン化されます。改訂されたデータは、それが使用される別の python 関数に送信されます。どうすればいいですか?すべての python 関数は default.py コントローラーに入りますか、それともフォーム データを処理するために新しい .py ファイルを作成する必要がありますか? ここに例があります。これにより、検索語がユーザーの入力として取得され、結果ページに送信されます。結果ページに送信する前に、Python スクリプトに送信するにはどうすればよいですか? 私はこれに本当に混乱しています!

index.html:

<div id="MainArea">
  <p align="center">MY SEARCH ENGINE</p>
  <form name="form1" method="get" action="results.html">
    <label for="SearchBar"></label>
    <div align="center">
      <input name="query" type="text" id="SearchBar" value="" size = "100px"><br />
      <input name="submit" type="submit" value="Search">
    </div>
  </form>
  <p align="center">&nbsp;</p>

</div>

results.html

{{extend 'layout.html'}}
<h1>This is the default/results.html template</h1>
{{=BEAUTIFY(response._vars)}}

<div>{{=results}}</div>

デフォルト.py:

import urllib2

def index():
    return dict()

def results():
    address = "http://www.blekko.com/?q=%(query)s+/json&auth=<mykey>" % dict(query=request.vars.query)
    response = urllib2.urlopen(address)
    html=response.read()
    return html
4

1 に答える 1

4

組み込みのフォーム メカニズムを使用しているようには見えません。興味があります。データをクリーンアップするには、どのように正確に行う必要がありますか?

通常、フォームを構築する関数と、それを処理するためのブランチを持つコントローラー ファイルを作成します。データ モデルでは、受け入れ可能な入力を指定し、フォーム処理関数 (コントローラー関数) でデータを操作します。

使用することもできます

form.process(..., onvalidation=some_func)

onvalidation は、フォームをさらに処理し、DB に格納する前に値を作成/操作し (または DB にまったく格納できない)、さらに検証を行うことができる関数です。

参照: http://web2py.com/books/default/chapter/29/7#onvalidation

Web2py フォームは通常、自己送信し、二重送信などを防ぐためにセッション キーが設定されています。セッションなしで form.accepts(...) を使用するか、web2py form.accepts/form.process をスキップして request.vars.field_name_that_you_provided を使用してフォーム フィールド データを取得する必要があります。 . 次に、データを自分で検証する必要があります。

web2py モデル (models/form.py) を作成するか、少なくとも、フォームの表示と処理を担当するコントローラー ファイル内で web2py の FORM ヘルパーを使用してフォームを作成することをお勧めします。

これが web2py のやり方です。入力するフォームを返すか、フォームを処理する単一の関数です。すべてがグルーヴィーな場合は、リダイレクトを使用して別のページに送信できます。

def display_form():
    form = FORM('Your name:',
            INPUT(_name='name', requires=IS_NOT_EMPTY()),
            INPUT(_type='submit'))
    if form.process().accepted:
        session.flash = 'form accepted'
        redirect(URL('next'))
    elif form.errors:
        response.flash = 'form has errors'
    else:
        response.flash = 'please fill the form'
    return dict(form=form)

別の方法はこれです:

def process_form():
   validated_data = dict()
   for k,v in request.vars.values(): # I think this works...
      if k == 'some_key':
         do_some_processing()
      ...
      validated_data[k] = some_func(v)
      ...
   # now everyhing is validated and ok, send the data on
   redirect('next_page', vars=validated_data)

リダイレクトは、検証済みのフォーム データを次の関数に送信します。それをweb2py関数に送信する必要がない場合は、必要な関数をprocess_form関数から実行してください。

わかる?

編集: 別の言い方をすれば、スクリプトの内容はフォーム処理関数で実行する必要があるということです。同じコントローラ ファイル内の別の関数によって明示的に実行されるコントローラ関数を定義できます。ビューが関連付けられておらず、スタンドアロンのページではなく、単なる機能です。

execfile("path/to/file") を使用することもできます。スクリプトを applications//private/ に配置し、 request.folder を使用してアプリが存在するフォルダーを取得してから、プライベートに追加することをお勧めします...次のようなものです:

execfile(os.path.join(request.folder, 'private', 'script.py'))

ただし、それが適切なパスを取得することを確認する必要があります。

編集 (フォームの検証): データ モデルの作成方法とフォーム/バリデーターの使用方法に関する web2py の書籍を参照してください ( http://web2py.com/books/default/chapter/29/7 )。web2pyデータモデルを定義するとき、バリデーターをフィールド定義に直接含めることができます。このようにして、データベースはそれが整数か文字列かを認識し、入力に長さまたは正規表現パターンを強制できます。利点は、作成するフォームが次のとおりであることです。

form = SQLFORM(db.some_table)

または: form = SQLFORM.factory(Field('some_field', 'integer'), Field('some_str', 'string', requires=IS_ALPHANUMERIC))

検証は非常に簡単です。整数型のフィールドは、入力された数値以外の値をすぐに削除します。ソース コードを変更したり、不適切な値で POST/GET リクエストを送信したりしても、form.process(...) メソッドはそれを無効にして、エラーを簡単に強調表示できるようにします。

フォーム定義の例を次に示します。

db.define_table('news_item',
  Field('title', 'string', label='Title', requires=IS_NOT_EMPTY()),
  Field('type', 'string', label='Type', requires=IS_IN_SET(news_types)),
  Field('pub_date', 'date', default=request.now),
  Field('post_date', 'date', default=request.now), # Set date defaults 
  Field('link', 'string', label='News Link', requires=IS_EMPTY_OR(IS_URL())),
  Field('img', 'upload', uploadfield='img_file', label='Story Title Image'),
  Field('img_file', 'blob', label='Story Title Image'),
  Field('tagline', 'text', label='Tagline', requires=IS_NOT_EMPTY()),
  Field('published', 'boolean', label='Published?', notnull=True, required=True),
)

これにより、プログラムで以前に定義されたデータベース (db = DAL("...connection string") ) に news_item というテーブルが作成され、すぐに見栄えの良いフォームを作成できます。多くのオプション パラメータがあることに注意してください。

DB をスキップしてフォームを直接作成することもできますが、それについてはドキュメントで調べてみましょう :)

于 2012-07-03T20:57:37.757 に答える