Thank you!
I think I finally got it. Now I would like to allow only 2 routes:

   - one is my "maintenance" because I want to use a jinja template instead 
   of returning the HTTPException
   - one is "dbmigration" because I still need to call my Cornice API

For the moment the maintenance mode affects all my routes and when its 
value is evaluated and there is a second problem which is an infinite loop 
when is_maintenance_mode is not True, because of
*else:*
*  # Call next tween/application and return its response unchanged.*
*  return handler(request)*
How should I do to avoid these issues?

 
 




Le vendredi 8 janvier 2021 à 14:34:53 UTC+1, C J a écrit :

> I get 'No module named 'maintenance_tween'. Should I separate the two 
> functions in 2 different files, both of them being in the same module?
>
> Le vendredi 8 janvier 2021 à 13:04:57 UTC+1, [email protected] a écrit :
>
>> Hi Cedric,
>> You just have to include your package from Pyramid main configuration 
>> file, using the "includes" section...
>> The "includeme" function will then be called automatically to register 
>> your tween!
>>
>> Thierry
>> -- 
>>   https://www.ulthar.net -- http://pyams.readthedocs.io
>>
>> Le ven. 8 janv. 2021 à 12:06, C J <[email protected]> a écrit :
>>
>>> I fixed my code by returning the function inside. But I still need to 
>>> understand where to call theses functions to set everything up.  
>>>
>>> def maintenance_tween_factory(handler, registry):
>>> # Return a tween callable.
>>> # 'handler' is the next tween or the WSGI application.
>>> # Deployment settings are in 'registry.settings'.
>>> def maintenance_tween(handler, request):
>>> is_maintenance_mode = request.registry.settings["in_maintenance"]
>>> if is_maintenance_mode and not "dbmigration" in request.matchdict: # 
>>> Could limit it to certain request.path's.
>>> # Return an error response, bypassing the application.
>>> return pyramid.response.HTTPServiceUnavailable(
>>> {
>>> "Maintenance": "Please note that we will be performing important server 
>>> maintenance in a few minutes, during which time the server will be 
>>> unavailable. If you are in the middle of something important, please save 
>>> your work or hold off on any critical actions until we are finished."
>>> }
>>> )
>>> else:
>>> # Call next tween/application and return its response unchanged.
>>> return handler(request)
>>> return maintenance_tween
>>> Le vendredi 8 janvier 2021 à 11:36:52 UTC+1, C J a écrit :
>>>
>>>> To everybody: thanks a lot for your answers. Sorry for the delay: I am 
>>>> living in France.
>>>> Bay the way I am still interested in the Pyramid CMS solution steps. 
>>>>
>>>> Mike,
>>>> I have created a file named maintenance.py in my utils module.
>>>> It contains:
>>>>
>>>> import pyramid
>>>>
>>>> def includeme(config):
>>>>   # Calculate the dotted name of the factory function.
>>>>   # E.g., "myapp.lib.mytween.my_tween_factory".
>>>>   maintenance_tween = __name__ + ".maintenance_tween_factory" 
>>>>   config.add_tween(maintenance_tween)
>>>>   # You can wrap app this in an 'if' to conditionally enable it; e.g.,
>>>>   # ``if 
>>>> pyramid.settings.asbool(config.registry.settings.get("myoption", True))``
>>>>
>>>>
>>>> def maintenance_tween_factory(handler, registry):
>>>>   # Return a tween callable.
>>>>   # 'handler' is the next tween or the WSGI application.
>>>>   # Deployment settings are in 'registry.settings'.
>>>>   def my_tween(handler, request):
>>>>     is_maintenance_mode = request.registry.settings["in_maintenance"]
>>>>      if is_maintenance_mode and not "dbmigration" in request.matchdict: # 
>>>> Could limit it to certain request.path's.
>>>>       # Return an error response, bypassing the application.
>>>>        return pyramid.response.HTTPServiceUnavailable(
>>>>          {
>>>>            "Maintenance": "Please note that we will be performing 
>>>> important server maintenance in a few minutes, during which time the 
>>>> server 
>>>> will be unavailable. If you are in the middle of something important, 
>>>> please save your work or hold off on any                  critical actions 
>>>> until we are finished."
>>>>          }  
>>>>        )  
>>>>      else:
>>>>        # Call next tween/application and return its response unchanged.
>>>>        return handler(request)
>>>>   return maintenance_tween
>>>>
>>>> I have also added    *in_maintenance = True*       in my 
>>>> production.ini file.
>>>>
>>>>
>>>>    - Now where should I import this modules? Where should I call these 
>>>>    functions?
>>>>    - Another point is that *maintenance_tween * is unknow in th 
>>>>    context of  def maintenance_tween_factory(handler, registry) so will 
>>>>    *return maintenance_tween*  work?
>>>>    - Also I want a Cornice API (dbmigration) which is in my views 
>>>>    module to still be available in production when I send a POST request 
>>>> or a 
>>>>    GET request to /dbmigration during the maintenance time. 
>>>>
>>>> I have read 
>>>> https://pyramid.readthedocs.io/en/latest/narr/hooks.html#registering-tweens
>>>> But I do not understand very well where to write and call the tweens 
>>>> lines of code.
>>>>
>>>>
>>>> Le vendredi 8 janvier 2021 à 07:47:18 UTC+1, Mike Orr a écrit :
>>>>
>>>>> I forgot the last line. The end of 'my_tween_factory' needs to 'return 
>>>>> my_tween'.
>>>>>
>>>>> On Thu, Jan 7, 2021 at 7:05 PM Mike Orr <[email protected]> wrote:
>>>>>
>>>>>> I have a request-logging tween in only a page of code. It's 
>>>>>> straightforward to write from the documentation.
>>>>>>
>>>>>>
>>>>>> https://pyramid.readthedocs.io/en/latest/narr/hooks.html#registering-tweens
>>>>>>
>>>>>> I adapted the code for your use case (untested). Your module would 
>>>>>> have something like this:
>>>>>>
>>>>>> # Module 'myapp.lib.mytween'
>>>>>>
>>>>>> def includeme(config):
>>>>>>     # Calculate the dotted name of the factory function.
>>>>>>     # E.g., "myapp.lib.mytween.my_tween_factory".
>>>>>>     factory_name = __name__ + ".my_tween_factory"
>>>>>>     config.add_tween(factory_name)
>>>>>>     # You can wrap app this in an 'if' to conditionally enable it; 
>>>>>> e.g.,
>>>>>>     # ``if 
>>>>>> pyramid.settings.asbool(config.registry.settings.get("myoption", True))``
>>>>>>
>>>>>> def my_tween_factory(handler, registry):
>>>>>>     # Return a tween callable.
>>>>>>     # 'handler' is the next tween or the WSGI application.
>>>>>>     # Deployment settings are in 'registry.settings'.
>>>>>>     def my_tween(handler, request):
>>>>>>         if is_maintenance_mode:   # Could limit it to certain 
>>>>>> request.path's.
>>>>>>             # Return an error response, bypassing the application.
>>>>>>             return 
>>>>>> pyramid.response.HTTPServiceUnavailable(maintenance_message)
>>>>>>         else:
>>>>>>             # Call next tween/application and return its response 
>>>>>> unchanged.
>>>>>>             return handler(request)
>>>>>>
>>>>>> Then list your module in 'pyramid.includes' in the config file. E.g., 
>>>>>> "myapp.lib.mytween".
>>>>>>
>>>>>> That 'if is_maintenance_mode' condition could check whether a 
>>>>>> specified file exists. The file path could be in a config setting.
>>>>>>
>>>>>> On Thu, Jan 7, 2021 at 3:32 PM C J <[email protected]> wrote:
>>>>>>
>>>>>>>
>>>>>>> That's really interesting Thierry. Can you please show me how to do? 
>>>>>>> I have tried to use tweens. I tried many things starting with
>>>>>>> *pyramid.tweens = pyramid_maintenance.tween_maintenance *and 
>>>>>>> modifying the *__init__.py* file, however, I do not understand what 
>>>>>>> they are and how to use them despite hours spent reading the Pyramid 
>>>>>>> documentation and different articles.
>>>>>>> Being working on a website that is already in production I also 
>>>>>>> wonder how I would be able to implement your solution based on an 
>>>>>>> external 
>>>>>>> CMS.
>>>>>>>
>>>>>>>
>>>>>>> [image: Mailtrack] 
>>>>>>> <https://mailtrack.io?utm_source=gmail&utm_medium=signature&utm_campaign=signaturevirality5&;>
>>>>>>>  Sender 
>>>>>>> notified by 
>>>>>>> Mailtrack 
>>>>>>> <https://mailtrack.io?utm_source=gmail&utm_medium=signature&utm_campaign=signaturevirality5&;>
>>>>>>>  07/01/21 
>>>>>>> à 21:59:31 
>>>>>>>
>>>>>>> On Thu, Jan 7, 2021 at 9:22 PM Thierry Florac <[email protected]> 
>>>>>>> wrote:
>>>>>>>
>>>>>>>> I've built a custom Pyramid tween to handle this and redirect 
>>>>>>>> requests while application is up!
>>>>>>>> It can handle redirects (based on regular expressions) before or 
>>>>>>>> after the request is handled by Pyramid application, to be able to set 
>>>>>>>> the 
>>>>>>>> site in "maintenance mode", or to handle custom redirects in case of 
>>>>>>>> NotFound exceptions...
>>>>>>>> All configuration is done through our Pyramid CMS.
>>>>>>>>
>>>>>>>> Best regards,
>>>>>>>> Thierry
>>>>>>>> -- 
>>>>>>>>   https://www.ulthar.net -- http://pyams.readthedocs.io
>>>>>>>>
>>>>>>>>
>>>>>>>> Le jeu. 7 janv. 2021 à 18:43, 'Jonathan Vanasco' via pylons-discuss 
>>>>>>>> <[email protected]> a écrit :
>>>>>>>>
>>>>>>>>> I typically handle this on nginx which sites in front of Pyramid.  
>>>>>>>>> if you wanted to do everything in python, you could probably use WSGI 
>>>>>>>>> middleware to route to a separate maintenance application or html 
>>>>>>>>> file.
>>>>>>>>>
>>>>>>>>> On Thursday, January 7, 2021 at 10:09:34 AM UTC-5 C J wrote:
>>>>>>>>>
>>>>>>>>>> Hi everybody,
>>>>>>>>>>
>>>>>>>>>> I am looking for an easy way to temporarily redirect all the 
>>>>>>>>>> users of my pyramid website to a maintenance vue without having to 
>>>>>>>>>> comment/delete, etc my routes.
>>>>>>>>>> I would like to make it easy to re-activate the others routes 
>>>>>>>>>> when the maintenance is done.
>>>>>>>>>> I found this :
>>>>>>>>>> https://pypi.org/project/pyramid_maintenance/
>>>>>>>>>> but  I always get :
>>>>>>>>>>
>>>>>>>>>> in renderer
>>>>>>>>>>     raise ValueError('No such renderer factory %s' % 
>>>>>>>>>> str(self.type))
>>>>>>>>>> ValueError: No such renderer factory .jinja2"
>>>>>>>>>>
>>>>>>>>>> with my browser displaying :
>>>>>>>>>> "Internal Server Error The server encountered an unexpected 
>>>>>>>>>> internal server error (generated by waitress)"
>>>>>>>>>>
>>>>>>>>>> I am new to Pyramid so please give me the necessary details step 
>>>>>>>>>> by step.
>>>>>>>>>>
>>>>>>>>>> Best regards.
>>>>>>>>>> Cedric J.
>>>>>>>>>>
>>>>>>>>> -- 
>>>>>>>>> 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 view this discussion on the web visit 
>>>>>>>>> https://groups.google.com/d/msgid/pylons-discuss/98a779a5-5bcc-4971-a271-a202cc49f732n%40googlegroups.com
>>>>>>>>>  
>>>>>>>>> <https://groups.google.com/d/msgid/pylons-discuss/98a779a5-5bcc-4971-a271-a202cc49f732n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>>>> .
>>>>>>>>>
>>>>>>>> -- 
>>>>>>>> You received this message because you are subscribed to a topic in 
>>>>>>>> the Google Groups "pylons-discuss" group.
>>>>>>>> To unsubscribe from this topic, visit 
>>>>>>>> https://groups.google.com/d/topic/pylons-discuss/jKTnofibd00/unsubscribe
>>>>>>>> .
>>>>>>>> To unsubscribe from this group and all its topics, send an email to 
>>>>>>>> [email protected].
>>>>>>>> To view this discussion on the web visit 
>>>>>>>> https://groups.google.com/d/msgid/pylons-discuss/CAPX_VWBO5j0im6r0RRKEf%3D%3DzXyx5y_Qp%3DUJ5bntEGQtdiDejKQ%40mail.gmail.com
>>>>>>>>  
>>>>>>>> <https://groups.google.com/d/msgid/pylons-discuss/CAPX_VWBO5j0im6r0RRKEf%3D%3DzXyx5y_Qp%3DUJ5bntEGQtdiDejKQ%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>>>>> .
>>>>>>>>
>>>>>>> -- 
>>>>>>> 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 view this discussion on the web visit 
>>>>>>> https://groups.google.com/d/msgid/pylons-discuss/CAJgq6FJC11OfFNbfhhPwfMKRJsJfpd2UpWUDs5SAm5hKaMWpzA%40mail.gmail.com
>>>>>>>  
>>>>>>> <https://groups.google.com/d/msgid/pylons-discuss/CAJgq6FJC11OfFNbfhhPwfMKRJsJfpd2UpWUDs5SAm5hKaMWpzA%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>>>>>> .
>>>>>>>
>>>>>>
>>>>>>
>>>>>> -- 
>>>>>> Mike Orr <[email protected]>
>>>>>>
>>>>>
>>>>>
>>>>> -- 
>>>>> Mike Orr <[email protected]>
>>>>>
>>>> -- 
>>> 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 view this discussion on the web visit 
>>> https://groups.google.com/d/msgid/pylons-discuss/e72f1fc0-a202-4244-8e57-576053b68ce2n%40googlegroups.com
>>>  
>>> <https://groups.google.com/d/msgid/pylons-discuss/e72f1fc0-a202-4244-8e57-576053b68ce2n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>

-- 
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 view this discussion on the web visit 
https://groups.google.com/d/msgid/pylons-discuss/fb905b43-8a78-41cb-9fe8-2b5880f15c72n%40googlegroups.com.

Reply via email to