2

werkzeug の使用を開始して、(urls.py ファイルから) URL を (フォルダー ビューから、次にさまざまな種類のビューを管理するために別のファイルで) ビューにマップしようとしましたが、私のフォルダー構成は次のようになります。

myapp/
   application.py
   urls.py
   views/
      __init__.py
      common.py
      places.py
      ...

私の urls.py ファイルは次のようになります。

from werkzeug.routing import Map, Rule  

url_map = Map([  
Rule('/places', endpoint='places.overview')  
])  

そして明らかに、views/places.py ファイルでその部分を取得しました:

def overview(request):
    mycode...
    render_template('places.html', extra...)

Werkzeug の例のほとんどは、ビューに URL をアタッチするためのデコレータ公開の利用を示しています。5 つまたは 6 つの URL を持つアプリでは実用的ですが、それ以上になると地獄になる可能性があります...

URLをビューに直接マップする簡単な方法はありますか???
ありがとう。

4

3 に答える 3

3
import letters # our views module

url_map = Map([
    Rule('/letters', endpoint=letters.index),
    Rule('/letters/<int:item_id>', endpoint=letters.item),
    Rule('/letters/<string:section_slug>', endpoint=letters.index),
    Rule('/letters/<string:section_slug>/<int:item_id>',
         endpoint=letters.item),
])

エンドポイントは関数を含めて何でもかまいませんので、デニスの例からインポートマジックをスキップできます

于 2009-11-25T16:09:05.927 に答える
3

簡単な例を次に示します。

import views

def app(environ, start_response):
    urls = url_map.bind_to_environ(environ)
    request = Request(environ)
    endpoint, params = urls.match()
    names = endpoint.split('.')
    view = views
    for name in names:
        if not hasattr(view, name):
            __import__(view.__name__, None, None, [name])
        view = getattr(view, name)
    try:
        response = view(request)
    except werkzeug.exceptions.HTTPException, exc:
        response = exc
    return response(environ, start_response)
于 2009-11-25T11:19:06.693 に答える
1

この問題に取り組むための好ましい方法であるかどうかはわかりません (私は werkzeug リポジトリで同様の例を見つけておらず、まだこのライブラリで遊んでいるだけです)、単純に Rule をサブクラス化することも可能です:

class CoolRule(Rule):

    def __init__(self, view, *args, **kwargs):
        self.view = view
        super(CoolRule, self).__init__(*args, **kwargs)

    def empty(self):
        """We need this method if we want to use 
           Submounts or Subdomain factories
        """
        defaults = dict(self.defaults) if self.defaults else None
        return CoolRule(self.view, self.rule, defaults, self.subdomain,
                        self.methods, self.build_only, self.endpoint, 
                        self.strict_slashes, self.redirect_to,
                        self.alias, self.host)


_url_map = Map([
    CoolRule(user.views.login, '/login', endpoint='user-login'),
    CoolRule(user.views.logout, '/logout', endpoint='user-logout'),
])

def dispatch(request):
    urls = _url_map.bind_to_environ(request.environ)
    rule, arguments = urls.match(return_rule=True)
    return rule.view(request, **arguments)

そうすれば、ビューの名前付けの抽象化のレイヤーを保持し、「文字列のインポート」による奇妙な魔法を回避できます。

于 2012-06-19T23:36:18.753 に答える