Hi guys,

I have a traversal based pyramid web app, there are controllers like this

@view_defaults(
    context=UserResource,
    renderer='json',
)
class UserController(ControllerBase):
    @view_config(request_method='GET', permission='view')
    def get(self):
        user = self.context.entity
        return user

    @view_config(request_method='PUT', permission='update')
    def put(self):
        # update user here
        return user


One problem I ran into was, I found out myself in need to add handler for 
CORS preflight requests. The code above will be something like this

@view_defaults(
    context=UserResource,
    renderer='json',
)
class UserController(ControllerBase):

    @view_config(request_method='OPTIONS', permission='options')
    def options(self):
        return Response(b'', headerlist=[
            ('Access-Control-Allow-Origin', 'http://localhost:8080'),
            ('Access-Control-Allow-Methods', 'POST'),
            ('Access-Control-Allow-Headers', 'Origin, Content-Type, Accept, 
Authorization'),
        ])

    # other code goes here

Turned out I will need to add a ton of these CORS handlers. Besides 
handling this manually, I am thinking about deal with it programmatically. 
I found out there are WSGI middleware like this one

https://github.com/may-day/wsgicors

Kind of able to do what I want, but still, it's not really ideal, as it 
applies to the whole app. Sometimes, I want to have fine-grand control over 
CORS for different endpoints.

For example, I may can define something like

    @view_config(request_method='PUT', permission='update', 
cors_allowed_origin='http://foobar.com')
    def put(self):
        # update user here
        return user

see the "cors_allow_origin" I added to view_config for this put method. 
There are also other things I can add. 

I am thinking about using "Introspectable" API, enumerate all the view, and 
define corresponding view via add_view method of config. Like this

def define_cors_views(config):
    for view in config introspectable views:
                 some rules to determine what kind of preflight view to add
        config.add_view # add the preflight request handler for the view

config.add_before_commit(define_cors_views)

Here comes the questions

   - Is there a hook or what I can use on config, to put my code for 
   scanning views and adding corresponding views before commit?
   - Is there any code sample similar to what I want to do, that I can 
   reference to?
   - Is this scan and add views for preflight request approach the best way 
   to do with Pyramid? Any other better ideas?


-- 
You received this message because you are subscribed to the Google Groups 
"pylons-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/pylons-discuss/18a4f9a5-d603-4011-932c-4491ce3740ba%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to