• flask的run的运行参数含义


    直接阅读源代码吧:

    在flask的app.py里,查看run函数的定义

        def run(self, host=None, port=None, debug=None, **options):
            """Runs the application on a local development server.  If the
            :attr:`debug` flag is set the server will automatically reload
            for code changes and show a debugger in case an exception happened.
         debug模式可以在代码变化后自动快速重启应用,使变化生效,同时在代码异常时打印出调试代码 
            If you want to run the application in debug mode, but disable the
            code execution on the interactive debugger, you can pass
            ``use_evalex=False`` as parameter.  This will keep the debugger's
            traceback screen active, but disable code execution.
            use_evalex参数的含义是,在代码错误时,仍然抛出错误栈,但是同时又(安全考虑)避免代码执行,这样,你在页面错误时,能看到堆栈信息,但是又没有办法使用console
            .. admonition:: Keep in Mind
    
               Flask will suppress any server error with a generic error page
               unless it is in debug mode.  As such to enable just the
               interactive debugger without the code reloading, you have to
               invoke :meth:`run` with ``debug=True`` and ``use_reloader=False``.
               Setting ``use_debugger`` to `True` without being in debug mode
               won't catch any exceptions because there won't be any to
               catch.
          在debug模式下,如果不使用代码变化后快速重启应用使修改代码生效的功能的话,使用参数use_reloader=False。在非debug模式下使用use_debugger参数是不会获取异常栈的 .. versionchanged:: 0.10 The default port is now picked from the ``SERVER_NAME`` variable. :param host: the hostname to listen on. Set this to ``'0.0.0.0'`` to have the server available externally as well. Defaults to ``'127.0.0.1'``. :param port: the port of the webserver. Defaults to ``5000`` or the port defined in the ``SERVER_NAME`` config variable if present. :param debug: if given, enable or disable debug mode. See :attr:`debug`. :param options: the options to be forwarded to the underlying Werkzeug server. See :func:`werkzeug.serving.run_simple` for more information.
    """
    flask的run函数实际是调用了Werkzeug的run_simple函数,因此还有一些可用参数,可以通过options参数传递给run_simple函数
    from werkzeug.serving import run_simple if host is None: host = '127.0.0.1' if port is None: server_name = self.config['SERVER_NAME'] if server_name and ':' in server_name: port = int(server_name.rsplit(':', 1)[1]) else: port = 5000 if debug is not None: self.debug = bool(debug) options.setdefault('use_reloader', self.debug) options.setdefault('use_debugger', self.debug) try: run_simple(host, port, self, **options) finally: # reset the first request information if the development server # resetted normally. This makes it possible to restart the server # without reloader and that stuff from an interactive shell. self._got_first_request = False

    参考wekzeug的serving.py代码

    def run_simple(hostname, port, application, use_reloader=False,
                   use_debugger=False, use_evalex=True,
                   extra_files=None, reloader_interval=1,
                   reloader_type='auto', threaded=False,
                   processes=1, request_handler=None, static_files=None,
                   passthrough_errors=False, ssl_context=None):
        """Start a WSGI application. Optional features include a reloader,
        multithreading and fork support.
    
        This function has a command-line interface too::
    
            python -m werkzeug.serving --help
    
        .. versionadded:: 0.5
           `static_files` was added to simplify serving of static files as well
           as `passthrough_errors`.
    
        .. versionadded:: 0.6
           support for SSL was added.
    
        .. versionadded:: 0.8
           Added support for automatically loading a SSL context from certificate
           file and private key.
    
        .. versionadded:: 0.9
           Added command-line interface.
    
        .. versionadded:: 0.10
           Improved the reloader and added support for changing the backend
           through the `reloader_type` parameter.  See :ref:`reloader`
           for more information.
    
        :param hostname: The host for the application.  eg: ``'localhost'``
        :param port: The port for the server.  eg: ``8080``
        :param application: the WSGI application to execute
        :param use_reloader: should the server automatically restart the python
                             process if modules were changed?
        :param use_debugger: should the werkzeug debugging system be used?
        :param use_evalex: should the exception evaluation feature be enabled?
        :param extra_files: a list of files the reloader should watch
                            additionally to the modules.  For example configuration
                            files.
        :param reloader_interval: the interval for the reloader in seconds.
        :param reloader_type: the type of reloader to use.  The default is
                              auto detection.  Valid values are ``'stat'`` and
                              ``'watchdog'``. See :ref:`reloader` for more
                              information.
        :param threaded: should the process handle each request in a separate
                         thread?
    这个参数的含义是:是否为每个请求开启一个线程 :param processes: if greater than 1 then handle each request in a new process up to this maximum number of concurrent processes.
    这个参数的含义是:是否为每一个请求开启一个进程,直到达到设置的并发进程的最大值 :param request_handler: optional parameter that can be used to replace the default one. You can use this to replace it with a different :class:`~BaseHTTPServer.BaseHTTPRequestHandler` subclass. :param static_files: a dict of paths for static files. This works exactly like :class:`SharedDataMiddleware`, it's actually just wrapping the application in that middleware before serving. :param passthrough_errors: set this to `True` to disable the error catching. This means that the server will die on errors but it can be useful to hook debuggers in (pdb etc.)
    这个参数将会禁止获取错误信息,但是也意为着一旦出现错误,服务器就会挂掉。这个参数在pdb调试时,很有用处 :param ssl_context: an SSL context for the connection. Either an :class:`ssl.SSLContext`, a tuple in the form ``(cert_file, pkey_file)``, the string ``'adhoc'`` if the server should automatically create one, or ``None`` to disable SSL (which is the default).
      https的设置:默认是None
    """ if use_debugger: from werkzeug.debug import DebuggedApplication application = DebuggedApplication(application, use_evalex) if static_files: from werkzeug.wsgi import SharedDataMiddleware application = SharedDataMiddleware(application, static_files) def log_startup(sock): display_hostname = hostname not in ('', '*') and hostname or 'localhost' if ':' in display_hostname: display_hostname = '[%s]' % display_hostname quit_msg = '(Press CTRL+C to quit)' port = sock.getsockname()[1] _log('info', ' * Running on %s://%s:%d/ %s', ssl_context is None and 'http' or 'https', display_hostname, port, quit_msg) def inner(): try: fd = int(os.environ['WERKZEUG_SERVER_FD']) except (LookupError, ValueError): fd = None srv = make_server(hostname, port, application, threaded, processes, request_handler, passthrough_errors, ssl_context, fd=fd) if fd is None: log_startup(srv.socket) srv.serve_forever() if use_reloader: # If we're not running already in the subprocess that is the # reloader we want to open up a socket early to make sure the # port is actually available. if os.environ.get('WERKZEUG_RUN_MAIN') != 'true': if port == 0 and not can_open_by_fd: raise ValueError('Cannot bind to a random port with enabled ' 'reloader if the Python interpreter does ' 'not support socket opening by fd.') # Create and destroy a socket so that any exceptions are # raised before we spawn a separate Python interpreter and # lose this ability. address_family = select_ip_version(hostname, port) s = socket.socket(address_family, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((hostname, port)) if hasattr(s, 'set_inheritable'): s.set_inheritable(True) # If we can open the socket by file descriptor, then we can just # reuse this one and our socket will survive the restarts. if can_open_by_fd: os.environ['WERKZEUG_SERVER_FD'] = str(s.fileno()) s.listen(LISTEN_QUEUE) log_startup(s) else: s.close() # Do not use relative imports, otherwise "python -m werkzeug.serving" # breaks. from werkzeug._reloader import run_with_reloader run_with_reloader(inner, extra_files, reloader_interval, reloader_type) else: inner()

  • 相关阅读:
    Javascript面向对象(三):非构造函数的继承
    Javascript面向对象(二):构造函数的继承
    Javascript 面向对象(一):封装
    .NET面试题系列[12]
    .NET面试题系列[11]
    .NET面试题系列[10]
    .NET面试题系列[9]
    .NET面试题系列[8]
    .NET面试题系列[7]
    .NET面试题系列[6]
  • 原文地址:https://www.cnblogs.com/shengulong/p/8111221.html
Copyright © 2020-2023  润新知