Домой Edit me on GitHub

2020-12-05

Каналы передачи данных | Сетевое программирование | Базы данных | Основы Веб-программирования

Предстваления (Views)

Представления (views) создаются в виде функций или методов и могут находится в любом месте проекта. В качестве аргумента функция принимает объект request, а возвращает объект response:

from pyramid.response import Response

def my_view(request):
    return Response("Hello, world!")

В классе, который содержит представления-методы, объект request передается в конструктор:

class MyHandler(object):
    def __init__(self, request):
        self.request = request

    def my_view(self):
        return Response("Hello, classy world!")

Конфигурация

route_name

Имя для привязки к роуту. Нужно если используется URL диспетчеризация.

renderer

Имя обработчика (string, json) или шаблон (index.jinja2, index.pt, index.mako).

permission

Строка и именем права доступа, которое текущий пользователь должен иметь чтобы вызвать это представление.

request_method

“GET”, “POST”, “PUT”, “DELETE’, “HEAD”.

request_param

Проверяет наличие параметров в запросе, например «foo» означает что в запросе должен быть параметр с именем «foo». «foo=1» означает что этот параметр должен быть равен 1.

match_param

Тоже что и request_param но проверяет все параметры, в том числе которые пришли от URL диспетчеризации.

Декларативный способ

Декларативный способ задания представлений осуществляется при помощи декораторов pyramid.view.view_config и pyramid.view.view_defaults.

from pyramid.view import view_config

class Handler(object):
    def __init__(self, request):
        self.request = request

class Main(Handler):

    @view_config(route_name="home", renderer="index.mako")
    def index(self):
        return {"project": "Akhet Demo"}

Функция или метод может быть привязана к нескольким представлениям.

class Main(Handler):

    @view_config(route_name="home", renderer="index.mako")
    @view_config(route_name="home_json", renderer="json")
    def index(self):
        return {"project": "Akhet Demo"}

Пример REST

from pyramid.view import view_defaults
from pyramid.view import view_config
from pyramid.response import Response

@view_defaults(route_name='rest')
class RESTView(object):
    def __init__(self, request):
        self.request = request

    @view_config(request_method='GET')
    def get(self):
        return Response('get')

    @view_config(request_method='POST')
    def post(self):
        return Response('post')

    @view_config(request_method='DELETE')
    def delete(self):
        return Response('delete')

Императивный способ

from pyramid.config import not_

...

   config.add_view(Main.index, route_name="home", request_method=not_('POST'))

Пример REST.

from pyramid.response import Response
from pyramid.config import Configurator

class RESTView(object):
    def __init__(self, request):
        self.request = request

    def get(self):
        return Response('get')

    def post(self):
        return Response('post')

    def delete(self):
        return Response('delete')

def main(global_config, **settings):
    config = Configurator()
    config.add_route('rest', '/rest')
    config.add_view(RESTView, route_name='rest', attr='get', request_method='GET')
    config.add_view(RESTView, route_name='rest', attr='post', request_method='POST')
    config.add_view(RESTView, route_name='rest', attr='delete', request_method='DELETE')
    return config.make_wsgi_app()

Совмещенный способ

from pyramid.view import view_defaults
from pyramid.response import Response
from pyramid.config import Configurator

@view_defaults(route_name='rest')
class RESTView(object):
    def __init__(self, request):
        self.request = request

    def get(self):
        return Response('get')

    def post(self):
        return Response('post')

    def delete(self):
        return Response('delete')

def main(global_config, **settings):
    config = Configurator()
    config.add_route('rest', '/rest')
    config.add_view(RESTView, attr='get', request_method='GET')
    config.add_view(RESTView, attr='post', request_method='POST')
    config.add_view(RESTView, attr='delete', request_method='DELETE')
    return config.make_wsgi_app()
Previous: REST API Next: Шаблоны (Templates)