Why does running the Flask dev server run itself twice?

前端 未结 6 2112
南旧
南旧 2020-11-22 01:39

I\'m using Flask for developing a website and while in development I run flask using the following file:

#!/usr/bin/env python
from datetime import datetime
         


        
6条回答
  •  醉话见心
    2020-11-22 02:30

    The Werkzeug reloader spawns a child process so that it can restart that process each time your code changes. Werkzeug is the library that supplies Flask with the development server when you call app.run().

    See the restart_with_reloader() function code; your script is run again with subprocess.call().

    If you set use_reloader to False you'll see the behaviour go away, but then you also lose the reloading functionality:

    app.run(port=4004, debug=config.DEBUG, host='0.0.0.0', use_reloader=False)
    

    You can disable the reloader when using the flask run command too:

    FLASK_DEBUG=1 flask run --no-reload
    

    You can look for the WERKZEUG_RUN_MAIN environment variable if you wanted to detect when you are in the reloading child process:

    import os
    if os.environ.get('WERKZEUG_RUN_MAIN') == 'true':
        print '################### Restarting @ {} ###################'.format(
            datetime.utcnow())
    

    However, if you need to set up module globals, then you should instead use the @app.before_first_request decorator on a function and have that function set up such globals. It'll be called just once after every reload when the first request comes in:

    @app.before_first_request
    def before_first_request():
        print '########### Restarted, first request @ {} ############'.format(
            datetime.utcnow())
    

    Do take into account that if you run this in a full-scale WSGI server that uses forking or new subprocesses to handle requests, that before_first_request handlers may be invoked for each new subprocess.

提交回复
热议问题