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.
