20
# /test{.format} no longer seems to work...
config.add_route('test', '/test.{ext}', view='ms.views.test')

ビュー.py:

from pyramid.response import Response
from pyramid.renderers import render

import json

def test(request):
    extension = request.matchdict['ext']
    variables = {'name' : 'blah', 'asd' : 'sdf'}

    if extension == 'html':
        output = render('mypackage:templates/blah.pt', variables, request=request)

    if extension == 'json':
        output = json.dumps(variables)

    return Response(output)

これを行う簡単な方法はありますか?Pylons を使用すると、次のように簡単になりました。

def test(self, format='html'):
    c.variables = {'a' : '1', 'b' : '2'}

    if format == 'json':
        return json.dumps(c.variables)

    return render('/templates/blah.html')

私はこれに間違った方法でアプローチしていると思われます...?

4

4 に答える 4

51

より良い方法は、異なるレンダラーで同じビューを 2 回追加することだと思います。次のビューがあるとします。

def my_view(request):
    return {"message": "Hello, world!"}

この構成では、同じビューを 2 回追加できます。

from pyramid.config import Configurator
config = Configurator()
config.add_route('test', '/test', my_view, renderer="templates/my_template.mako")
config.add_route('test', '/test', my_view, renderer="json", xhr=True)

今あるもの:

  1. ブラウザで url を指定すると、ビューは返された dict をコンテキストとして提供してmy_viewテンプレートをレンダリングします。"templates/my_template.mako"/test
  2. XHR リクエストをmy_view行うと、再度呼び出されますが、返された dict は JSON としてエンコードされ、呼び出し元に送信されます (リクエストが XHR 経由で行われたかどうかを確認する方法については、ドキュメントを参照してください)。

異なるルートを定義するために使用できるのと同じ考え方ですが、同じビューがそれらにアタッチされています。

from pyramid.config import Configurator
config = Configurator()
config.add_route('test', '/test', my_view, renderer="templates/my_template.mako")
config.add_route('test_json', '/test.json', my_view, renderer="json")

/testテンプレートのレンダリングをトリガーするようになりましたが、JSON/test.jsonでエンコードされた文字列のみを返します。

さらに進んで、メソッドacceptの引数を介して適切なレンダラーにディスパッチすることができます。add_router

from pyramid.config import Configurator
config = Configurator()
config.add_route('test', '/test', my_view, renderer="templates/my_template.mako")
config.add_route('test', '/test', my_view, renderer="json", accept="application/json")

リクエストにヘッダーが値Acceptに設定されているapplication/json場合は JSON が返されます。それ以外の場合は、レンダリングされたテンプレートが取得されます。

これは、ビューからの応答をエンコードするデータ形式のセットが事前定義されている場合にのみ機能しますが、これは通常のケースです。動的なディスパッチが必要な場合は、ルールで適切なレンダラーを選択するdecorate引数でビューを装飾できます。add_route

于 2011-01-08T13:26:19.837 に答える
6

これはあなたが探しているものですか?Pylons と Pyramid には異なる API があります。したがって、それらは異なります。もう少し似たものにすることはできますが、同じにすることはできません。

def test(request):
    extension = request.matchdict['ext']
    variables = {'name' : 'blah', 'asd' : 'sdf'}

    if extension == 'json':
        return Response( json.dumps(variables) )

    return Response( render('mypackage:templates/blah.pt', variables, request=request) )
于 2011-01-08T12:46:20.557 に答える
2

PyramidURL Dispatchは非常に強力で柔軟なメカニズムです。まず、正しい URL パターンを記述します。ルート パターン構文では、置換マーカーに 正規表現を使用できます。

'/test{ext:\\..*}'

ここで、url パスに . (ピリオド) に続いて任意の記号。を含むすべての記号。(ピリオド) は のキーの下になりextますrequest.matchdict

もちろん、どの拡張子が存在するかを指定するために、正規表現を複雑にすることができます。

'/test{ext:\\.(html|json)}'

次に、パターンを使用してルートを追加します。

config.add_route('test',
                 pattern='/test{ext:\\.(html|json)}')

追加したいのは、カスタム述語を使用して拡張機能のセットを指定できることです。

デフォルトの拡張子を指定するために、単純なpregeneratorを使用できます。

def default_extension(ext):
    def pregenerator(request, elements, kw):
        if 'ext' not in kw:
            kw['ext'] = ext

        return elements, kw

    return pregenerator

config.add_route('test',
                 pattern='/test{ext:\\.(html|json)}',
                 pregenerator=default_extension('.html'))

request.route_path('test')
# '/test.html'
request.route_path('test', ext='.json')
# '/test.json'

その後、トラバーサルを使用して、 htmljsonの出力 を切り替えることができます。

config.add_route('test',
                 '/test{ext:\\.(html|json)}',
                 pregenerator=default_extension('.html'),
                 traverse='{ext}')

traverse引数を使用して、アプリケーションをハイブリッドadd_routeにすることを強制します。また、ビューにコンテキストを提供するファクトリには、拡張機能に一致するキーを含めてはならないことを理解する必要があります。デフォルトのルート ファクトリはそうではありません。

ビュー.py:

from pyramid.view import view_config, view_defaults


@view_defaults(route_name='test')
class Test(object):
    def __init__(self, request):
        self.request = request
        self.variables = {
            'name': 'blah',
            'asd': 'sdf'
        }

    @view_config(name='.html', renderer='mypackage:templates/blah.pt')
    def html(request):
        return {
            'request': request,
            'variables': self.variables
        }

    @view_config(name='.json', renderer='json')
    def json(request):
        return {
            'request': request,
            'variables': self.variables
        }

ここではclass Test、ルート名を作成して指定します。そして、メソッドを拡張機能の名前で分けました。

于 2013-10-03T10:02:56.577 に答える