bottle.py is a fast and simple micro-framework for python web-applications.

Overview
Bottle Logo Tests Status Latest Version License

Bottle: Python Web Framework

Bottle is a fast, simple and lightweight WSGI micro web-framework for Python. It is distributed as a single file module and has no dependencies other than the Python Standard Library.

  • Routing: Requests to function-call mapping with support for clean and dynamic URLs.
  • Templates: Fast and pythonic *built-in template engine* and support for mako, jinja2 and cheetah templates.
  • Utilities: Convenient access to form data, file uploads, cookies, headers and other HTTP-related metadata.
  • Server: Built-in HTTP development server and support for paste, fapws3, bjoern, Google App Engine, cherrypy or any other WSGI capable HTTP server.

Homepage and documentation: http://bottlepy.org

Example: "Hello World" in a bottle

from bottle import route, run, template

@route('/hello/<name>')
def index(name):
    return template('<b>Hello {{name}}</b>!', name=name)

run(host='localhost', port=8080)

Run this script or paste it into a Python console, then point your browser to http://localhost:8080/hello/world. That's it.

Download and Install

Install the latest stable release with pip install bottle or download bottle.py (unstable) into your project directory. There are no hard dependencies other than the Python standard library. Bottle runs with Python 2.7 and 3.6+.

License

Code and documentation are available according to the MIT License (see LICENSE).

The Bottle logo however is NOT covered by that license. It is allowed to use the logo as a link to the bottle homepage or in direct context with the unmodified library. In all other cases, please ask first.

Comments
  • Proposal for asynchronous responses in Bottle

    Proposal for asynchronous responses in Bottle

    If the Issue tracker is wrong place to discuss this, just let me know.

    Preface:

    I'm recently obsessed with Bottle and using it in every web project that allows me to use Python. I love its shocking simplicity and transparency, and the fact that each web request probably only goes through about a hundred lines of python code before getting to my response handler. Totally subjectively, I just love the way it "feels" and developing with it makes me all warm and fuzzy inside (as opposed to Twisted, which just rubs me the wrong way; or Tornado, which has perfectly reasonable syntax but just not the style I prefer).

    Issue:

    I have a few new projects that require a client "push" feature, aka comet, long polling, all that stuff. As you probably know, basically all of the possible ways to implement push in the pre-WebSockets era require a web response handler on the backend to block for an extended period of time in some form or another. As you also probably know, a stock WSGI environment will be largely ruined by this, since the entire process will be blocked on a single response handler.

    I also use Redis with redis-py and potentially other blocking client libraries. Scaling for concurrent requests in a non-threaded environment becomes more complicated with any libraries that block on network I/O; it's not always sufficient to just run a whole bunch of Bottle processes. For example, some clients have already had their requests routed by the load balancer to a particular server instance, and if another client on that instance blocks, then the network packets will just sit in the queue for a while, causing slow response times and making poor use of the machine's CPU resources (since it could be doing something else while blocked on network I/O).

    Right now I am serving the push feed in a separate Diesel app. This is not ideal, as I would prefer for the load balancer to distribute across a homogeneous pool of servers all running the same code for simplicity and maintainability reasons (and I don't want to have to monitor multiple process types if I can avoid it). I also don't seem to be able to flush the output buffer and keep going with Diesel's server, killing persistent-request feed options like MXHR, but that's possibly just something I'm doing wrong.

    Proposal:

    I propose light-weight support for asynchronous response handlers, possibly with an @async decorator. There seem to be two general camps about the syntax for asynchronous code in this kind of Python environment: callbacks and coroutines. Tornado uses callbacks, which are probably easier to understand but not as elegant and do not really support progressive output (like flushing the output buffer). Diesel uses coroutines, which can make some pretty elegant "pythonic" code and supports pausing repeatedly but can also be hard to wrap one's brain around and be tricky to implement cleanly on the backend. Note that there is also a project called Swirl that brings the coroutine style to Tornado.

    Here is a possible syntax style for each option:

    Callback

    from bottle import route, async
    import time
    
    @route()
    @async
    def response():
        def doStuff():
            body = "I like sleep."
            time.sleep(3)
            body = body + " Alot."
            time.sleep(3)
            return body
    
        def callback():     # Maybe with request & response args?
            return "OK, I'm awake."
        # Always return a 2-tuple of a worker callable and a callback callable
        return (doStuff, callback)
    

    Coroutine

    from bottle import route, async
    
    @route()
    @async
    def response():
        yield "I like sleep."
        time.sleep(3)    # Or something like yield diesel.sleep(3)
        yield " Alot."
        time.sleep(3)    # Or something like yield diesel.sleep(3)
        yield "OK, I'm awake."
    

    I'd vote for the coroutine option, but it's possible there are implementation issues with it I'm not thinking of.

    The hard part

    The really tricky part is that Bottle is not a WSGI server; it always uses another WSGI server (which is usually quite handy). This means that the main application loop is not handled by Bottle but the server (which may be using epoll or libevent or libev or eventlets or Stackless Python or ...).

    Option 1: Do almost nothing in Bottle

    It is possible that really minor modifications to Bottle would allow it to pass through generator return types to the underlying server and hope it supports it. However, builtin libs will still block the entire process (like time.sleep). Diesel and Cogen work around this by offering custom functions you have to call instead: yield diesel.sleep(3). Eventlet can actually modify/wrap the builtin packages to be asynchronous, which is pretty nifty. With the minor modification route, the @async decorator might not even be necessary, since Diesel will accept generators automatically. On a side note, Fapws3 claims to be asynchronous, but I have no idea what part of it is asynchronous. It does not seem to support any method of having an asynchronous response handler that I could find; I'll have to ask that community about it since I really like Fapws3 otherwise.

    Option 2: Do everything in Bottle

    It would be awesome if there were a magical way to handle it cleanly all inside of Bottle in a way that worked with all of the possible servers. Bottle would need to track async responses that had not finished, and probably execute async responses in a closure with local request/response object copies. However, I don't know if the underlying WSGI servers (or the rest of the WSGI) would handle having more than one request at a time; I'm not very familiar with WSGI yet. If they also have single global request/response objects like Bottle, they would almost certainly break.

    If this approach is possible, Eventlet, Concurrence, and Cogen seem like the most likely candidates. Greenlet would probably do the Bottle part at least as efficiently, but it does not directly assist with things like networking.

    The theory would be that Bottle would spawn two thread-like-things at the same time: one that just calls the WSGI server's main loop, and one for the pending response book-keeping. Whenever a synchronous response finishes, or an async response yields, the microthread's equivalent of switch() would be called (in the case of Concurrence or Eventlet), or yield (in the case of a Cogen coroutine).

    Option 3: Require specific WSGI server[s]

    I suspect that being asynchronous in Bottle simply will not work with most WSGI servers, and it will require using the WSGI server that comes with the particular async library. Fortunately, Concurrence, Eventlet, and Cogen all offer a WSGI server. There might need to be a global flag in Bottle like the debug flag that enables asynchronous support, and the async decorator would just do pass-through. In asynchronous mode, Bottle could throw an error if the given WSGI server callable is not in a list of known supported async servers.

    My plan

    If you don't hate the idea of supporting async requests in Bottle, I would love to make a temporary fork and do some or all of the implementation myself. I would attempt option 3, since it seems the easiest/safest, and I would first attempt with either Cogen or Eventlet. I'm somewhat torn between the two, but I'm leaning towards Cogen since I feel coroutines are more pythonic and elegant than explicit microthread switching (and it doesn't even require hacking the builtin packages like socket or time). Eventlet could make redis-py async automatically, but then it's not clear while looking at the code that a call like val = redis.get('mykey') is going to yield. With Cogen you would have to manually yield like val = yield redis.get('mykey'), but it's more clear what is happening.

    If you've managed to continue reading all the way through this, I'm going to start a fork and play around with it in the hopes that it could get merged into Bottle master. I will probably attempt to first use Cogen, using this guide.

    What are your thoughts? Do have any interest in Bottle supporting async requests, especially via coroutines? If so, how do you feel about an @async decorator vs. automatically detecting via something like inspect.isgenerator()? Also, once async works, would flushing the output buffer be possible for persistent requests?

    Feature 
    opened by sunetos 50
  • strange bug: first request after launching the browser is skipped - (pending) request

    strange bug: first request after launching the browser is skipped - (pending) request

    Platform: Windows 10 Enterprise, build 19041 ; Python 3.8 ; Bottle v.0.12.19 Tested browsers: Chrome, Edge No internet connection on the computer

    Run this app.py in a console:

    from bottle import Bottle, TEMPLATE_PATH, template, static_file
    app = Bottle("")
    TEMPLATE_PATH.append("templates")
    @app.route("/pages/<page>")
    def page_route(page=None):
        return template(f"{page}.html")
    app.run(port=5001)
    

    templates/starting.html

    hello
    
    • Then open Edge or Chrome, enter http://127.0.0.1:5001/pages/starting in the URL bar, then enter. Then the circular progress bar is turning, but the request isn't done.
    • It is not logged in the Python/bottle console (which usually logs all requests)
    • The browser Developer Tools > Network tab shows Status (pending)
    • If I refresh the browser by selecting the URL bar and re-do ENTER, then it works, the request is done, and the browser shows "hello".
    • Same problem if I launch the browser from command-line: chrome.exe --kiosk http://127.0.0.1:5001/pages/starting, sometimes it works, sometimes this page is not loaded on startup
    • This issue never happens when I use python -m http.server, so it might potentially be linked to bottle
    • I cannot reproduce the bug on another Windows 7 computer

    Do you have any idea?

    opened by josephernest 27
  • won't start with pythonw

    won't start with pythonw

    I wrote a simple service, and tried to deploy it on windows. I used pythonw.exe to start the script. But bottle won't start. The process started and then quickly closed. But if I started it using python.exe, the process works fine. I think this might be a bug. The process won't start even if I just imported bottle but not doing anything. The code looks like this. pythonw hello_world.py would start, and then quickly shutdown.

    '''
    hello_world.py
    '''
    import bottle
    import time
    
    if __name__ == '__main__':
        while True:
            print('Hello, world')
            time.sleep(2)
    

    However, python hello_world.py will do the work, and if I comment import bottle out, pythonw will do the job too.

    opened by huangyanhan976 18
  • new server adapter

    new server adapter

    new server adapter for @Ksengine/Servelight This server is based on wsgiref source code. but with following updates.

    • PEP 3333 for python 2
    • python 2 and 3 both supported
    • unix sockets supported
    • Fix for IPv6 addresses
    • SSL supported
    • threading server - uses threads to handle requests. This is useful to handle web browsers pre-opening sockets, on which Server would wait indefinitely.
    • multiprocessing server -handle each request in a new process.
    • Prevent reverse DNS lookups
    • Prevent ResourceWarning: unclosed socket on KeyboardInterrupt
    • when given 0 as port use random port and update port to actual port

    so I added server adapter I had read -

    • https://github.com/bottlepy/bottle/pull/647#issuecomment-60152870
    • https://github.com/bottlepy/bottle/pull/865#issuecomment-242795341

    according to #1253 Isuue

    opened by Ksengine 17
  • When I use **while** not stop in the views

    When I use **while** not stop in the views

    Hello guys, I'm trying to use the while statement in views, but I don't stop, even if the condition is met, look this:

                <div class="flexslider flexslider-thumb">
                  <ul class="previews-list slides">
                    <% qtd_img = 0 %>
                    % for i in range(1, 11):
                        % if getattr(produto, 'imagem' + str(i)) is not None:
                    <li>
                        <a id="imgthb_{{i}}" href="{{usar_webp(get_imagem('produtos', getattr(produto, 'imagem' + str(i))))}}" class="cloud-zoom-gallery" rel="useZoom: 'zoom1', smallImage: '{{usar_webp(get_imagem('produtos', getattr(produto, 'imagem' + str(i))))}}'">
                            <img src="{{usar_webp(get_imagem('produtos', getattr(produto, 'imagem' + str(i))))}}" alt="Imagem {{i}}"/>
                        </a>
                    </li>
                        <% qtd_img += 1 %>
                        % end
                    % end
                    {{qtd_img}}
                    % while qtd_img < 3:
                    <li>
                        <a href="{{usar_webp('/static/images/branco400.jpg')}}" class="cloud-zoom-gallery" rel="useZoom: 'zoom1', smallImage: '{{usar_webp('/static/images/branco400.jpg')}}'">
                            <img src="{{usar_webp(''/static/images/branco400.jpg')}}" alt="Sem imagem"/>
                        </a>
                    </li>
                      <% qtd_img += 1 %>
                    % end
                  </ul>
                </div>
    

    In this code I try use the while instruction to show in minimal three images for the slide layout. But never stops, anybody know solve this?

    Bug 
    opened by parg-programador 16
  • .get_undecorated_callback() bugfix

    .get_undecorated_callback() bugfix

    I've found obscure error triggered in case of decorators with multiple parameters.

    Now, the .get_undecorated_callback() method just picks first attribute, which doesn't have to be function, but also one of the parameters of decorator with multiple parameters.

    For example, this decorator will trigger the bug:

    def database_decorator(fn=None, filename="default.sqlite", table="default"):
        """
        Open connection to the database and offer it to the wrapped function.
    
        So far, there is no database, only primitive JSON load/store system.
        """
        def database_decorator_wrapper(fn):
            @wraps(fn)
            def database_wrapper(*args, **kwargs):
                path = filename
                if not os.path.isabs(path):
                    path = os.path.join(settings.DATABASE_PATH, path)
    
                # load database
                db = SqliteDict(
                    path,
                    # autocommit=True
                )
    
                # load table
                table_ref = db.get(table, {})
    
                # put table to function parameters
                kwargs["db"] = table_ref
    
                out = fn(*args, **kwargs)
    
                # save database
                db[table] = table_ref
                db.commit()
    
                return out
    
            return database_wrapper
    
        if fn:  # python decorator with optional parameters bukkake
            return database_decorator_wrapper(fn)
    
        return database_decorator_wrapper
    

    My patch just looks for cases when the func is not FunctionType instance (which it should be) and then goes thru all the parameters and pick first FunctionType instance.

    opened by Bystroushaak 15
  • gevent-1.3.0 and bottle 0.12.13

    gevent-1.3.0 and bottle 0.12.13

    The reciently relased version of gevent (version 1.3.0.) is crashing bottle (it updated from 1.2.2 to 1.3.0)

     INFO:root:Namespace(host='40d6ffd5f91f', port=4546)
     Bottle v0.12.13 server starting up (using GeventServer())...
     Listening on http://40d6ffd5f91f:4546/
     Hit Ctrl-C to quit.
    
     Traceback (most recent call last):
       File "/myapp/cuckoo_api_mockup.py", line 69, in <module>
         run(host=args.host, port=args.port, server='gevent')
       File "/usr/local/lib/python2.7/site-packages/bottle.py", line 3127, in run
         server.run(app)
       File "/usr/local/lib/python2.7/site-packages/bottle.py", line 2907, in run
         from gevent import wsgi, pywsgi, local
     ImportError: cannot import name wsgi
    
    opened by CrimsonGlory 14
  • DeprecationWarning: Flags not at the start of the expression

    DeprecationWarning: Flags not at the start of the expression

    from bottle import route, run, template
    
    @route('/hello/<name>')
    def index(name):
        return template('<b>Hello {{name}}</b>!', name=name)
    
    run(host='localhost', port=8080, debug=True, reloader=True)
    

    When I run this code($ python3 hello.py) I get that error:

    Bottle v0.13-dev server starting up (using WSGIRefServer())...
    Listening on http://localhost:8080/
    Hit Ctrl-C to quit.
    
    /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/sre_parse.py:864: DeprecationWarning: Flags not at the start of the expression \{\{((?:(?mx)(       (truncated)
      p = _parse_sub(source, pattern, True, False)
    

    Bottle is awesome. Thanks for your great work!

    opened by burhanteo 14
  • 0.12.18: test suite is failing

    0.12.18: test suite is failing

    I've copied to may package test procedure which is in Fedora package however it fails. How bottle should be tested? I see tox.ini file however looks like under python >= 3.8 nothing is tested.

    + cd bottle-0.12.18
    + /usr/bin/python3 test/testall.py verbose
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:53: SyntaxWarning: "is" with a literal. Did you mean "=="?
      if rv is 128: # Import error
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:57: SyntaxWarning: "is" with a literal. Did you mean "=="?
      if rv is 3: # Port in use
    test__header (test_auth.TestBasicAuth) ... ok
    test_load_dict (test_config.TestConfDict) ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_config.py:39: DeprecationWarning: Please use assertEqual instead.
      self.assertEquals(c['a.b.foo'], 5)
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_config.py:40: DeprecationWarning: Please use assertEqual instead.
      self.assertEquals(c['a.b.bar'], 6)
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_config.py:41: DeprecationWarning: Please use assertEqual instead.
      self.assertEquals(c['a.baz'], 7)
    ok
    test_meta (test_config.TestConfDict) ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_config.py:32: DeprecationWarning: Please use assertEqual instead.
      self.assertEquals(c['int'], 6)
    ok
    test_namespaces (test_config.TestConfDict) ... ok
    test_update (test_config.TestConfDict) ... ok
    test_write (test_config.TestConfDict) ... ok
    test_attr_access (test_configdict.TestConfigDict)
    ConfigDict allow attribute access to keys. ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_configdict.py:30: DeprecationWarning: Attribute assignment is deprecated.
      c.test = 5
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_configdict.py:31: DeprecationWarning: Attribute access is deprecated.
      self.assertEqual(5, c.test)
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_configdict.py:34: DeprecationWarning: Attribute access is deprecated.
      self.assertEqual(6, c.test)
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_configdict.py:38: DeprecationWarning: Attribute access is deprecated.
      self.assertEqual(None, c.test)
    ok
    test_call (test_configdict.TestConfigDict)
    Calling updates and returns the dict. ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_configdict.py:61: DeprecationWarning: Calling ConfDict is deprecated. Use the update() method.
      self.assertEqual(c, c(a=1))
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_configdict.py:63: DeprecationWarning: Attribute access is deprecated.
      self.assertEqual(1, c.a)
    ok
    test_isadict (test_configdict.TestConfigDict)
    ConfigDict should behaves like a normal dict. ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_configdict.py:12: DeprecationWarning: Constructor does no longer accept parameters.
      d, m = dict(a=5), ConfigDict(a=5)
    ok
    test_issue588 (test_configdict.TestConfigDict)
    `ConfigDict` namespaces break route options ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_configdict.py:70: DeprecationWarning: Accessing namespaces as dicts is discouraged. Only use flat item access: cfg["names"]["pace"]["key"] -> cfg["name.space.key"]
      self.assertEqual('c', c['a']['b'])
    /usr/lib64/python3.8/_collections_abc.py:744: DeprecationWarning: Accessing namespaces as dicts is discouraged. Only use flat item access: cfg["names"]["pace"]["key"] -> cfg["name.space.key"]
      yield (key, self._mapping[key])
    ok
    test_issue720 (test_configdict.TestConfigDict)
    Accept unicode keys. ... ok
    test_namespaces (test_configdict.TestConfigDict)
    Access to a non-existent uppercase attribute creates a new namespace. ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_configdict.py:43: DeprecationWarning: Attribute access is deprecated.
      self.assertEqual(ConfigDict.Namespace, c.Name.Space.__class__)
    /usr/lib64/python3.8/_collections_abc.py:660: DeprecationWarning: Accessing namespaces as dicts is discouraged. Only use flat item access: cfg["names"]["pace"]["key"] -> cfg["name.space.key"]
      return self[key]
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_configdict.py:44: DeprecationWarning: Attribute access is deprecated.
      c.Name.Space.value = 5
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_configdict.py:44: DeprecationWarning: Attribute assignment is deprecated.
      c.Name.Space.value = 5
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_configdict.py:45: DeprecationWarning: Attribute access is deprecated.
      self.assertEqual(5, c.Name.Space.value)
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_configdict.py:46: DeprecationWarning: Attribute access is deprecated.
      self.assertTrue('value' in c.Name.Space)
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_configdict.py:47: DeprecationWarning: Attribute access is deprecated.
      self.assertTrue('Space' in c.Name)
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_configdict.py:51: DeprecationWarning: Attribute assignment is deprecated.
      self.assertRaises(AttributeError, lambda: setattr(c, 'Name', 5))
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_configdict.py:53: DeprecationWarning: Attribute assignment is deprecated.
      self.assertRaises(AttributeError, lambda: setattr(c, 'keys', 5))
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_configdict.py:56: DeprecationWarning: Attribute access is deprecated.
      self.assertEqual(5, c.Name)
    ok
    test_string_key_only (test_configdict.TestConfigDict) ... ok
    test_request (test_contextlocals.TestThreadLocals) ... ok
    test_response (test_contextlocals.TestThreadLocals) ... ok
    test_absolute_path (test_environ.TestRedirect) ... ok
    test_host_http_1_0 (test_environ.TestRedirect) ... ok
    test_host_http_1_1 (test_environ.TestRedirect) ... ok
    test_host_http_proxy (test_environ.TestRedirect) ... ok
    test_redirect_preserve_cookies (test_environ.TestRedirect) ... ok
    test_relative_path (test_environ.TestRedirect) ... ok
    test_sheme (test_environ.TestRedirect) ... ok
    test_specialchars (test_environ.TestRedirect)
    The target URL is not quoted automatically. ... ok
    test_app_property (test_environ.TestRequest) ... ok
    test_auth (test_environ.TestRequest) ... ok
    test_bigbody (test_environ.TestRequest)
    Environ: Request.body should handle big uploads using files ... ok
    test_body (test_environ.TestRequest)
    Environ: Request.body should behave like a file object factory ... ok
    test_body_noclose (test_environ.TestRequest)
    Test that the body file handler is not closed after request.POST ... ok
    test_bodypost (test_environ.TestRequest) ... ok
    test_chunked (test_environ.TestRequest) ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_environ.py:302: DeprecationWarning: Please use assertEqual instead.
      self.assertEquals(tob(expect), BaseRequest(e).body.read())
    ok
    test_chunked_illegal_size (test_environ.TestRequest) ... ok
    test_chunked_meta_fields (test_environ.TestRequest) ... ok
    test_chunked_not_chunked_at_all (test_environ.TestRequest) ... ok
    test_chunked_not_terminated (test_environ.TestRequest) ... ok
    test_chunked_wrong_size (test_environ.TestRequest) ... ok
    test_cookie_dict (test_environ.TestRequest)
    Environ: Cookie dict ... ok
    test_dict_access (test_environ.TestRequest)
    Environ: request objects are environment dicts ... ok
    test_get (test_environ.TestRequest)
    Environ: GET data ... ok
    test_getpostleak (test_environ.TestRequest)
    Environ: GET and POST should not leak into each other ... ok
    test_header_access (test_environ.TestRequest)
    Environ: Request objects decode headers ... ok
    test_header_access_special (test_environ.TestRequest) ... ok
    test_isajax (test_environ.TestRequest) ... ok
    test_json_empty (test_environ.TestRequest)
    Environ: Request.json property with empty body. ... ok
    test_json_forged_header_issue616 (test_environ.TestRequest) ... ok
    test_json_header_empty_body (test_environ.TestRequest)
    Request Content-Type is application/json but body is empty ... ok
    test_json_noheader (test_environ.TestRequest)
    Environ: Request.json property with missing content-type header. ... ok
    test_json_tobig (test_environ.TestRequest)
    Environ: Request.json property with huge body. ... ok
    test_json_valid (test_environ.TestRequest)
    Environ: Request.json property. ... ok
    test_method (test_environ.TestRequest) ... ok
    test_multipart (test_environ.TestRequest)
    Environ: POST (multipart files and multible values per key) ... /usr/lib64/python3.8/genericpath.py:30: ResourceWarning: unclosed file <_io.FileIO name=3 mode='rb+' closefd=True>
      st = os.stat(path)
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    ok
    test_params (test_environ.TestRequest)
    Environ: GET and POST are combined in request.param ... ok
    test_path (test_environ.TestRequest)
    PATH_INFO normalization. ... ok
    test_pathshift (test_environ.TestRequest)
    Request.path_shift() ... ok
    test_post (test_environ.TestRequest)
    Environ: POST data ... ok
    test_readonly_environ (test_environ.TestRequest) ... ok
    test_remote_addr (test_environ.TestRequest) ... ok
    test_remote_route (test_environ.TestRequest) ... ok
    test_route_property (test_environ.TestRequest) ... ok
    test_script_name (test_environ.TestRequest)
    SCRIPT_NAME normalization. ... ok
    test_tobigbody (test_environ.TestRequest)
    Environ: Request.body should truncate to Content-Length bytes ... ok
    test_url (test_environ.TestRequest)
    Environ: URL building ... ok
    test_url_for_property (test_environ.TestRequest) ... ok
    test_user_defined_attributes (test_environ.TestRequest) ... ok
    test_append_header (test_environ.TestResponse) ... ok
    test_charset (test_environ.TestResponse) ... ok
    test_constructor_body (test_environ.TestResponse) ... ok
    test_constructor_headerlist (test_environ.TestResponse) ... ok
    test_constructor_status (test_environ.TestResponse) ... ok
    test_content_type (test_environ.TestResponse) ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_environ.py:581: DeprecationWarning: Please use assertEqual instead.
      self.assertEquals('test/some', rs.headers.get('Content-Type'))
    ok
    test_delete_cookie (test_environ.TestResponse) ... FAIL
    test_delete_header (test_environ.TestResponse) ... ok
    test_expires_header (test_environ.TestResponse) ... ok
    test_non_string_header (test_environ.TestResponse) ... ok
    test_prevent_control_characters_in_headers (test_environ.TestResponse) ... ok
    test_set_cookie (test_environ.TestResponse) ... ok
    test_set_cookie_expires (test_environ.TestResponse) ... ok
    test_set_cookie_maxage (test_environ.TestResponse) ... ok
    test_set_header (test_environ.TestResponse) ... ok
    test_set_status (test_environ.TestResponse) ... ok
    test_bytes (test_environ.TestWSGIHeaderDict) ... ok
    test_dict (test_environ.TestWSGIHeaderDict) ... ok
    test_empty (test_environ.TestWSGIHeaderDict) ... ok
    test_native (test_environ.TestWSGIHeaderDict) ... ok
    test_unicode (test_environ.TestWSGIHeaderDict) ... ok
    test_content_type (test_fileupload.TestFileUpload) ... ok
    test_filename (test_fileupload.TestFileUpload) ... ok
    test_name (test_fileupload.TestFileUpload) ... ok
    test_preserve_case_issue_582 (test_fileupload.TestFileUpload) ... ok
    test_raw_filename (test_fileupload.TestFileUpload) ... ok
    test_save_buffer (test_fileupload.TestFileUpload) ... /usr/lib64/python3.8/unittest/case.py:633: ResourceWarning: unclosed file <_io.BufferedReader name='/home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_fileupload.py'>
      method()
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    ok
    test_save_dir (test_fileupload.TestFileUpload) ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_fileupload.py:67: ResourceWarning: unclosed file <_io.BufferedReader name='/tmp/tmp2jm10rky/test_fileupload.py'>
      self.assertEqual(fu.file.read(), open(filepath, 'rb').read())
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    ok
    test_save_file (test_fileupload.TestFileUpload) ... /usr/lib64/python3.8/unittest/case.py:633: ResourceWarning: unclosed file <_io.BufferedRandom name=4>
      method()
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    ok
    test_save_overwrite_lock (test_fileupload.TestFileUpload) ... ok
    test_attr_access (test_formsdict.TestFormsDict)
    FomsDict.attribute returs string values as unicode. ... ok
    test_attr_missing (test_formsdict.TestFormsDict)
    FomsDict.attribute returs u'' on missing keys. ... ok
    test_attr_unicode_error (test_formsdict.TestFormsDict)
    FomsDict.attribute returs u'' on UnicodeError. ... ok
    test_decode_method (test_formsdict.TestFormsDict) ... ok
    test_data_import (test_importhook.TestImportHooks) ... ok
    test_direkt_import (test_importhook.TestImportHooks) ... ok
    test_ext_isfile (test_importhook.TestImportHooks)
    The virtual module needs a valid __file__ attribute. ... ok
    test_from_import (test_importhook.TestImportHooks) ... ok
    test_import_fail (test_importhook.TestImportHooks)
    Test a simple static page with this server adapter. ... ok
    test_custom_filters (test_jinja2.TestJinja2Template)
    Templates: jinja2 custom filters ... ok
    test_custom_tests (test_jinja2.TestJinja2Template)
    Templates: jinja2 custom tests ... ok
    test_error (test_jinja2.TestJinja2Template)
    Templates: Exceptions ... ok
    test_file (test_jinja2.TestJinja2Template)
    Templates: Jinja2 file ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/bottle.py:3230: DeprecationWarning: The template lookup path list should not be empty.
      self.filename = self.search(self.name, self.lookup)
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/bottle.py:3345: DeprecationWarning: The template lookup path list should not be empty.
      fname = self.search(name, self.lookup)
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/bottle.py:3345: DeprecationWarning: Absolute template path names are deprecated.
      fname = self.search(name, self.lookup)
    ok
    test_inherit (test_jinja2.TestJinja2Template)
    Templates: Jinja2 lookup and inherience ... ok
    test_name (test_jinja2.TestJinja2Template)
    Templates: Jinja2 lookup by name ... ok
    test_notfound (test_jinja2.TestJinja2Template)
    Templates: Unavailable templates ... ok
    test_string (test_jinja2.TestJinja2Template)
    Templates: Jinja2 string ... ok
    test_template_shortcut (test_jinja2.TestJinja2Template) ... ok
    test_view_decorator (test_jinja2.TestJinja2Template) ... ok
    test_error (test_mako.TestMakoTemplate)
    Templates: Exceptions ... ok
    test_file (test_mako.TestMakoTemplate)
    Templates: Mako file ... ok
    test_inherit (test_mako.TestMakoTemplate)
    Templates: Mako lookup and inherience ... ok
    test_name (test_mako.TestMakoTemplate)
    Templates: Mako lookup by name ... ok
    test_notfound (test_mako.TestMakoTemplate)
    Templates: Unavailable templates ... ok
    test_string (test_mako.TestMakoTemplate)
    Templates: Mako string ... ok
    test_template_shortcut (test_mako.TestMakoTemplate) ... ok
    test_view_decorator (test_mako.TestMakoTemplate) ... ok
    test_headergetbug (test_mdict.TestMultiDict)
    Assure HeaderDict.get() to be case insensitive ... ok
    test_isadict (test_mdict.TestMultiDict)
    MultiDict should behaves like a normal dict ... ok
    test_isheader (test_mdict.TestMultiDict)
    HeaderDict replaces by default and title()s its keys ... ok
    test_ismulti (test_mdict.TestMultiDict)
    MultiDict has some special features ... ok
    test_merge (test_mount.TestAppMerging) ... ok
    test_mount (test_mount.TestAppMounting) ... ok
    test_mount_json_bug (test_mount.TestAppMounting) ... ok
    test_mount_meta (test_mount.TestAppMounting) ... ok
    test_mount_no_plugins (test_mount.TestAppMounting) ... ok
    test_mount_order_bug581 (test_mount.TestAppMounting) ... ok
    test_mount_wsgi (test_mount.TestAppMounting) ... ok
    test_mount_wsgi_ctype_bug (test_mount.TestAppMounting) ... ok
    test_no_slash_prefix (test_mount.TestAppMounting) ... ok
    test_bytearray (test_outputfilter.TestOutputFilter) ... ok
    test_bytes (test_outputfilter.TestOutputFilter) ... ok
    test_cookie (test_outputfilter.TestOutputFilter)
    WSGI: Cookies ... ok
    test_empty_generator_callback (test_outputfilter.TestOutputFilter) ... ok
    test_emptylist (test_outputfilter.TestOutputFilter) ... ok
    test_error (test_outputfilter.TestOutputFilter) ... ok
    test_error_in_generator_callback (test_outputfilter.TestOutputFilter) ... ok
    test_fatal_error (test_outputfilter.TestOutputFilter) ... ok
    test_fatal_error_in_generator_callback (test_outputfilter.TestOutputFilter) ... ok
    test_file (test_outputfilter.TestOutputFilter) ... ok
    test_generator_callback (test_outputfilter.TestOutputFilter) ... ok
    test_httperror_in_generator_callback (test_outputfilter.TestOutputFilter) ... ok
    test_httpresponse_in_generator_callback (test_outputfilter.TestOutputFilter) ... ok
    test_illegal (test_outputfilter.TestOutputFilter) ... ok
    test_invalid_generator_callback (test_outputfilter.TestOutputFilter) ... ok
    test_iterator_with_close (test_outputfilter.TestOutputFilter) ... ok
    test_json (test_outputfilter.TestOutputFilter) ... ok
    test_json_HTTPError (test_outputfilter.TestOutputFilter) ... ok
    test_json_HTTPResponse (test_outputfilter.TestOutputFilter) ... ok
    test_json_serialization_error (test_outputfilter.TestOutputFilter)
    Verify that 500 errors serializing dictionaries don't return ... ok
    test_none (test_outputfilter.TestOutputFilter) ... ok
    test_tuple (test_outputfilter.TestOutputFilter) ... ok
    test_unicode (test_outputfilter.TestOutputFilter) ... ok
    test_unicode_generator_callback (test_outputfilter.TestOutputFilter) ... ok
    test_apply (test_plugins.TestPluginAPI) ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/bottle.py:533: DeprecationWarning: Switch to Plugin API v2 and access the Route object directly.
      context = self if api > 1 else self._context
    ok
    test_callable (test_plugins.TestPluginAPI) ... ok
    test_close (test_plugins.TestPluginAPI) ... ok
    test_instance_method_wrapper (test_plugins.TestPluginAPI) ... ok
    test_setup (test_plugins.TestPluginAPI) ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_plugins.py:198: DeprecationWarning: Please use assertEqual instead.
      self.assertEquals(getattr(plugin, 'app', None), self.app)
    ok
    test_install_decorator (test_plugins.TestPluginManagement) ... ok
    test_install_non_plugin (test_plugins.TestPluginManagement) ... ok
    test_install_plugin (test_plugins.TestPluginManagement) ... ok
    test_plugin_oder (test_plugins.TestPluginManagement) ... ok
    test_route_plugin (test_plugins.TestPluginManagement) ... ok
    test_skip_all (test_plugins.TestPluginManagement) ... ok
    test_skip_by_class (test_plugins.TestPluginManagement) ... ok
    test_skip_by_instance (test_plugins.TestPluginManagement) ... ok
    test_skip_by_name (test_plugins.TestPluginManagement) ... ok
    test_skip_nonlist (test_plugins.TestPluginManagement) ... ok
    test_uninstall_all (test_plugins.TestPluginManagement) ... ok
    test_uninstall_by_instance (test_plugins.TestPluginManagement) ... ok
    test_uninstall_by_name (test_plugins.TestPluginManagement) ... ok
    test_uninstall_by_type (test_plugins.TestPluginManagement) ... ok
    test_get (test_resources.TestResourceManager) ... ok
    test_open (test_resources.TestResourceManager) ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_resources.py:76: ResourceWarning: unclosed file <_io.TextIOWrapper name='/home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_resources.py' mode='r' encoding='UTF-8'>
      self.assertEqual(fp.read(), open(__file__).read())
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    /usr/lib64/python3.8/unittest/case.py:633: ResourceWarning: unclosed file <_io.TextIOWrapper name='/home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_resources.py' mode='r' encoding='UTF-8'>
      method()
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    ok
    test_path_absolutize (test_resources.TestResourceManager) ... ok
    test_path_create (test_resources.TestResourceManager) ... ok
    test_path_normalize (test_resources.TestResourceManager) ... ok
    test_path_order (test_resources.TestResourceManager) ... ok
    test_path_unique (test_resources.TestResourceManager) ... ok
    test_root_path (test_resources.TestResourceManager) ... ok
    test_callback_inspection (test_route.TestRoute) ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/bottle.py:557: DeprecationWarning: inspect.getargspec() is deprecated since Python 3.0, use inspect.signature() or inspect.getfullargspec()
      return getargspec(self.get_undecorated_callback())[0]
    ok
    testBasic (test_router.TestRouter) ... ok
    testBuild (test_router.TestRouter) ... ok
    testBuildAnon (test_router.TestRouter) ... ok
    testBuildFilter (test_router.TestRouter) ... ok
    testErrorInPattern (test_router.TestRouter) ... ok
    testFloatFilter (test_router.TestRouter) ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/bottle.py:386: RuntimeWarning: Route <GET /object/<id:float>> overwrites a previously defined route
      warnings.warn(msg % (method, rule), RuntimeWarning)
    ok
    testIntFilter (test_router.TestRouter) ... ok
    testNewSyntax (test_router.TestRouter) ... ok
    testParentheses (test_router.TestRouter) ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/bottle.py:386: RuntimeWarning: Route <GET /func2(:param#(foo|bar)#)> overwrites a previously defined route
      warnings.warn(msg % (method, rule), RuntimeWarning)
    ok
    testPathFilter (test_router.TestRouter) ... ok
    testValueErrorInFilter (test_router.TestRouter) ... ok
    testWildcardNames (test_router.TestRouter) ... ok
    test_any_static_before_dynamic (test_router.TestRouter)
    Static ANY routes have higher priority than dynamic ANY routes. ... ok
    test_dynamic_any_if_method_exists (test_router.TestRouter)
    Check dynamic ANY routes if the matching method is known, ... ok
    test_dynamic_before_static_any (test_router.TestRouter)
    Static ANY routes have lower priority than dynamic GET routes. ... ok
    test_lots_of_routes (test_router.TestRouter) ... ok
    testBasic (test_router.TestRouterInCGIMode) ... ok
    testBuild (test_router.TestRouterInCGIMode) ... ok
    testBuildAnon (test_router.TestRouterInCGIMode) ... ok
    testBuildFilter (test_router.TestRouterInCGIMode) ... ok
    testErrorInPattern (test_router.TestRouterInCGIMode) ... ok
    testFloatFilter (test_router.TestRouterInCGIMode) ... ok
    testIntFilter (test_router.TestRouterInCGIMode) ... ok
    testNewSyntax (test_router.TestRouterInCGIMode) ... ok
    testParentheses (test_router.TestRouterInCGIMode) ... ok
    testPathFilter (test_router.TestRouterInCGIMode) ... ok
    testValueErrorInFilter (test_router.TestRouterInCGIMode) ... ok
    testWildcardNames (test_router.TestRouterInCGIMode) ... ok
    test_any_static_before_dynamic (test_router.TestRouterInCGIMode)
    Static ANY routes have higher priority than dynamic ANY routes. ... ok
    test_dynamic_any_if_method_exists (test_router.TestRouterInCGIMode)
    Check dynamic ANY routes if the matching method is known, ... ok
    test_dynamic_before_static_any (test_router.TestRouterInCGIMode)
    Static ANY routes have lower priority than dynamic GET routes. ... ok
    test_lots_of_routes (test_router.TestRouterInCGIMode) ... ok
    testDeEncode (test_securecookies.TestSecureCookies) ... ok
    testIsEncoded (test_securecookies.TestSecureCookies) ... ok
    testValid (test_securecookies.TestSecureCookiesInBottle) ... ok
    testWrongKey (test_securecookies.TestSecureCookiesInBottle) ... ok
    test_asctime (test_sendfile.TestDateParser)
    DateParser: asctime format ... ok
    test_bad (test_sendfile.TestDateParser)
    DateParser: Bad format ... ok
    test_rfc1123 (test_sendfile.TestDateParser)
    DateParser: RFC 1123 format ... ok
    test_rfc850 (test_sendfile.TestDateParser)
    DateParser: RFC 850 format ... ok
    test_download (test_sendfile.TestSendFile)
    SendFile: Download as attachment ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_sendfile.py:85: ResourceWarning: unclosed file <_io.BufferedReader name='/home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_sendfile.py'>
      f = static_file(os.path.basename(__file__), root='./')
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_sendfile.py:86: ResourceWarning: unclosed file <_io.BufferedReader name='/home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_sendfile.py'>
      self.assertEqual(open(__file__,'rb').read(), f.body.read())
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    /usr/lib64/python3.8/unittest/case.py:633: ResourceWarning: unclosed file <_io.BufferedReader name='/home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_sendfile.py'>
      method()
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    ok
    test_ims (test_sendfile.TestSendFile)
    SendFile: If-Modified-Since ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_sendfile.py:77: ResourceWarning: unclosed file <_io.BufferedReader name='/home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_sendfile.py'>
      self.assertEqual(open(__file__,'rb').read(), static_file(os.path.basename(__file__), root='./').body.read())
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    ok
    test_invalid (test_sendfile.TestSendFile)
    SendFile: Invalid requests ... ok
    test_mime (test_sendfile.TestSendFile)
    SendFile: Mime Guessing ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_sendfile.py:62: ResourceWarning: unclosed file <_io.BufferedReader name='/home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_sendfile.py'>
      f = static_file(os.path.basename(__file__), root='./', mimetype='some/type')
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_sendfile.py:64: ResourceWarning: unclosed file <_io.BufferedReader name='/home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_sendfile.py'>
      f = static_file(os.path.basename(__file__), root='./', mimetype='text/foo')
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_sendfile.py:66: ResourceWarning: unclosed file <_io.BufferedReader name='/home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_sendfile.py'>
      f = static_file(os.path.basename(__file__), root='./', mimetype='text/foo', charset='latin1')
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    ok
    test_range (test_sendfile.TestSendFile) ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_sendfile.py:93: ResourceWarning: unclosed file <_io.BufferedReader name='/home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_sendfile.py'>
      self.assertEqual(c.read(16), tob('').join(f.body))
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_sendfile.py:94: ResourceWarning: unclosed file <_io.BufferedReader name='test_sendfile.py'>
      self.assertEqual('bytes 10-25/%d' % len(open(basename, 'rb').read()),
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    /usr/lib64/python3.8/unittest/case.py:633: ResourceWarning: unclosed file <_io.BufferedReader name='test_sendfile.py'>
      method()
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    ok
    test_range_parser (test_sendfile.TestSendFile) ... ok
    test_valid (test_sendfile.TestSendFile)
    SendFile: Valid requests ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_sendfile.py:43: ResourceWarning: unclosed file <_io.BufferedReader name='/home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_sendfile.py'>
      self.assertEqual(open(__file__,'rb').read(), out.body.read())
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    ok
    test_simple (test_server.MeinheldServer)
    Test a simple static page with this server adapter. ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35762)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35764)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    WARNING: Skipping 'meinheld' test (ImportError).
    ok
    /usr/lib64/python3.8/unittest/suite.py:84: ResourceWarning: unclosed file <_io.BufferedReader name=3>
      return self.run(*args, **kwds)
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    /usr/lib64/python3.8/unittest/suite.py:84: ResourceWarning: unclosed file <_io.BufferedReader name=5>
      return self.run(*args, **kwds)
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    test_simple (test_server.TestBjoernServer)
    Test a simple static page with this server adapter. ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35766)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35768)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    WARNING: Skipping 'bjoern' test (ImportError).
    ok
    test_simple (test_server.TestCherryPyServer)
    Test a simple static page with this server adapter. ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35770)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35772)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    WARNING: Skipping 'cherrypy' test (ImportError).
    ok
    test_simple (test_server.TestDieselServer)
    Test a simple static page with this server adapter. ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35774)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35776)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    WARNING: Skipping 'diesel' test (ImportError).
    ok
    test_simple (test_server.TestEventletServer)
    Test a simple static page with this server adapter. ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35778)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35780)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    WARNING: Skipping 'eventlet' test (ImportError).
    ok
    test_simple (test_server.TestFapwsServer)
    Test a simple static page with this server adapter. ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35782)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35784)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    WARNING: Skipping 'fapws3' test (ImportError).
    ok
    test_simple (test_server.TestGeventServer)
    Test a simple static page with this server adapter. ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35786)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35788)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    WARNING: Skipping 'gevent' test (ImportError).
    ok
    test_simple (test_server.TestGunicornServer)
    Test a simple static page with this server adapter. ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35790)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35792)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    WARNING: Skipping 'gunicorn' test (ImportError).
    ok
    test_simple (test_server.TestPasteServer)
    Test a simple static page with this server adapter. ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35794)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    ok
    test_simple (test_server.TestRocketServer)
    Test a simple static page with this server adapter. ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35800)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35802)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    WARNING: Skipping 'rocket' test (ImportError).
    ok
    test_simple (test_server.TestServer)
    Test a simple static page with this server adapter. ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35804)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    ok
    test_simple (test_server.TestTornadoServer)
    Test a simple static page with this server adapter. ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35810)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35812)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    WARNING: Skipping 'tornado' test (ImportError).
    ok
    test_simple (test_server.TestTwistedServer)
    Test a simple static page with this server adapter. ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35814)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35816)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_server.py:47: ResourceWarning: unclosed <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 35818)>
      if ping('127.0.0.1', port): return
    ResourceWarning: Enable tracemalloc to get the object allocation traceback
    ok
    test_defect_coding (test_stpl.TestSTPLDir) ... ok
    test_multiline_block (test_stpl.TestSTPLDir) ... ok
    test_multiline_comprehensions_in_code_line (test_stpl.TestSTPLDir) ... ok
    test_multiline_eob_after_end (test_stpl.TestSTPLDir) ... ok
    test_multiline_eob_in_single_line_code (test_stpl.TestSTPLDir) ... ok
    test_multiline_find_eob_in_comments (test_stpl.TestSTPLDir) ... ok
    test_multiline_ignore_eob_in_string (test_stpl.TestSTPLDir) ... ok
    test_multiline_indention (test_stpl.TestSTPLDir) ... ok
    test_multiline_strings_in_code_line (test_stpl.TestSTPLDir) ... ok
    test_old_include (test_stpl.TestSTPLDir) ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/bottle.py:3584: DeprecationWarning: The include and rebase keywords are functions now.
      line, comment = self.fix_backward_compatibility(line, comment)
    ok
    test_old_include_with_args (test_stpl.TestSTPLDir) ... ok
    test_blocks (test_stpl.TestSimpleTemplate)
    Templates: Code blocks and loops ... ok
    test_bug_block_keywords_eat_prefixed_code (test_stpl.TestSimpleTemplate)
    #595: Everything before an 'if' statement is removed, resulting in ... ok
    test_bug_no_whitespace_before_stmt (test_stpl.TestSimpleTemplate) ... ok
    test_coding_stress (test_stpl.TestSimpleTemplate) ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/bottle.py:3584: DeprecationWarning: PEP263 encoding strings in templates are deprecated.
      line, comment = self.fix_backward_compatibility(line, comment)
    ok
    test_commentbug (test_stpl.TestSimpleTemplate)
    A "#" sign within an string is not a comment ... ok
    test_commentonly (test_stpl.TestSimpleTemplate)
    Templates: Commentd should behave like code-lines (e.g. flush text-lines) ... ok
    test_data (test_stpl.TestSimpleTemplate)
    Templates: Data representation ... ok
    test_dedentbug (test_stpl.TestSimpleTemplate)
    One-Line dednet blocks should not change indention ... ok
    test_defnied (test_stpl.TestSimpleTemplate) ... ok
    test_detect_pep263 (test_stpl.TestSimpleTemplate)
    PEP263 strings in code-lines change the template encoding on the fly ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/bottle.py:195: DeprecationWarning: Template encodings other than utf8 are no longer supported.
      value = obj.__dict__[self.func.__name__] = self.func(obj)
    ok
    test_elsebug (test_stpl.TestSimpleTemplate)
    Whirespace between block keyword and colon is allowed ... ok
    test_error (test_stpl.TestSimpleTemplate)
    Templates: Exceptions ... ok
    test_escape (test_stpl.TestSimpleTemplate) ... ok
    test_escaped_codelines (test_stpl.TestSimpleTemplate) ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/bottle.py:3378: DeprecationWarning: Escape code lines with a backslash.
      code = parser.translate()
    ok
    test_file (test_stpl.TestSimpleTemplate) ... ok
    test_get (test_stpl.TestSimpleTemplate) ... ok
    test_global_config (test_stpl.TestSimpleTemplate) ... ok
    test_htmlutils_quote (test_stpl.TestSimpleTemplate) ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_stpl.py:55: DeprecationWarning: Please use assertEqual instead.
      self.assertEquals('"&lt;&#039;&#13;&#10;&#9;&quot;\\&gt;"', html_quote('<\'\r\n\t"\\>'));
    ok
    test_ignore_late_pep263 (test_stpl.TestSimpleTemplate)
    PEP263 strings must appear within the first two lines ... ok
    test_ignore_pep263_in_textline (test_stpl.TestSimpleTemplate)
    PEP263 strings in text-lines have no effect ... ok
    test_import (test_stpl.TestSimpleTemplate)
    Templates: import statement ... ok
    test_include (test_stpl.TestSimpleTemplate)
    Templates: Include statements ... ok
    test_multiline (test_stpl.TestSimpleTemplate)
    Block statements with non-terminating newlines ... ok
    test_name (test_stpl.TestSimpleTemplate) ... ok
    test_newline_in_parameterlist (test_stpl.TestSimpleTemplate)
    Block statements with non-terminating newlines in list ... ok
    test_nobreak (test_stpl.TestSimpleTemplate)
    Templates: Nobreak statements ... ok
    test_noescape (test_stpl.TestSimpleTemplate) ... ok
    test_noescape_setting (test_stpl.TestSimpleTemplate) ... ok
    test_nonobreak (test_stpl.TestSimpleTemplate)
    Templates: Escaped nobreak statements ... ok
    test_notfound (test_stpl.TestSimpleTemplate)
    Templates: Unavailable templates ... ok
    test_onelineblocks (test_stpl.TestSimpleTemplate)
    Templates: one line code blocks ... ok
    test_onelinebugs (test_stpl.TestSimpleTemplate)
    One-Line blocks should not change indention ... ok
    test_rebase (test_stpl.TestSimpleTemplate)
    Templates: %rebase and method passing ... ok
    test_self_as_variable_name (test_stpl.TestSimpleTemplate) ... ok
    test_setdefault (test_stpl.TestSimpleTemplate) ... ok
    test_string (test_stpl.TestSimpleTemplate)
    Templates: Parse string ... ok
    test_template_shortcut (test_stpl.TestSimpleTemplate) ... ok
    test_unicode (test_stpl.TestSimpleTemplate) ... ok
    test_unicode_code (test_stpl.TestSimpleTemplate)
    Templates: utf8 code in file ... ok
    test_view_decorator (test_stpl.TestSimpleTemplate) ... ok
    test_view_decorator_issue_407 (test_stpl.TestSimpleTemplate) ... ok
    test_winbreaks (test_stpl.TestSimpleTemplate)
    Templates: Test windows line breaks ... ok
    test_winbreaks_end_bug (test_stpl.TestSimpleTemplate) ... ok
    test_module_shortcuts (test_wsgi.TestAppShortcuts) ... ok
    test_module_shortcuts_with_different_name (test_wsgi.TestAppShortcuts) ... ok
    test_autoroute (test_wsgi.TestDecorators) ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/bottle.py:2648: DeprecationWarning: inspect.getargspec() is deprecated since Python 3.0, use inspect.signature() or inspect.getfullargspec()
      spec = getargspec(func)
    ok
    test_routebuild (test_wsgi.TestDecorators)
    WSGI: Test route builder ... ok
    test_truncate_body (test_wsgi.TestDecorators)
    WSGI: Some HTTP status codes must not be used with a response-body ... ok
    test_view (test_wsgi.TestDecorators)
    WSGI: Test view-decorator (should override autojson) ... ok
    test_view_error (test_wsgi.TestDecorators)
    WSGI: Test if view-decorator reacts on non-dict return values correctly. ... ok
    test_apply (test_wsgi.TestRouteDecorator) ... ok
    test_apply_list (test_wsgi.TestRouteDecorator) ... ok
    test_callback (test_wsgi.TestRouteDecorator) ... ok
    test_decorators (test_wsgi.TestRouteDecorator) ... ok
    test_hooks (test_wsgi.TestRouteDecorator) ... ok
    test_method (test_wsgi.TestRouteDecorator) ... ok
    test_method_list (test_wsgi.TestRouteDecorator) ... ok
    test_name (test_wsgi.TestRouteDecorator) ... /home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_wsgi.py:259: DeprecationWarning: Please use assertEqual instead.
      self.assertEquals('/test/6', bottle.url('foo', x=6))
    ok
    test_no_params_at_all (test_wsgi.TestRouteDecorator) ... ok
    test_no_path (test_wsgi.TestRouteDecorator) ... ok
    test_path_list (test_wsgi.TestRouteDecorator) ... ok
    test_single_path (test_wsgi.TestRouteDecorator) ... ok
    test_template (test_wsgi.TestRouteDecorator) ... ok
    test_template_opts (test_wsgi.TestRouteDecorator) ... ok
    test_303 (test_wsgi.TestWsgi)
    WSGI: redirect (HTTP 303) ... ok
    test_401 (test_wsgi.TestWsgi)
    WSGI: abort(401, '') (HTTP 401) ... ok
    test_500 (test_wsgi.TestWsgi)
    WSGI: Exceptions within handler code (HTTP 500) ... ok
    test_500_unicode (test_wsgi.TestWsgi) ... ok
    test_anymethod (test_wsgi.TestWsgi) ... ok
    test_cookie (test_wsgi.TestWsgi)
    WSGI: Cookies ... ok
    test_generator_callback (test_wsgi.TestWsgi) ... ok
    test_get (test_wsgi.TestWsgi)
    WSGI: GET routes ... ok
    test_headget (test_wsgi.TestWsgi)
    WSGI: HEAD routes and GET fallback ... ok
    test_post (test_wsgi.TestWsgi)
    WSGI: POST routes ... ok
    test_request_attrs (test_wsgi.TestWsgi)
    WSGI: POST routes ... ok
    test_utf8_404 (test_wsgi.TestWsgi) ... ok
    test_utf8_url (test_wsgi.TestWsgi)
    WSGI: UTF-8 Characters in the URL ... ok
    
    ======================================================================
    FAIL: test_delete_cookie (test_environ.TestResponse)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/home/tkloczko/rpmbuild/BUILD/bottle-0.12.18/test/test_environ.py", line 627, in test_delete_cookie
        self.assertTrue('name=;' in cookies[0])
    AssertionError: False is not true
    
    ----------------------------------------------------------------------
    Ran 333 tests in 5.004s
    
    FAILED (failures=1)
    

    Some warning says that code needs to be updated for python >= 3.8.

    opened by kloczek 13
  • getting HTTP_AUTHENTICATION key missing with custom auth middleware

    getting HTTP_AUTHENTICATION key missing with custom auth middleware

    Hey team, I am a long time fan of bottle and this is my first issue - so thank you.

    I inherited a contract with the front end that relies on the header: {'authentication': 'bearer TOKEN'}, where TOKEN is a session token. I am getting the unexpected error:

        return tonat(self.environ[self._ekey(key)], 'latin1')
    KeyError: 'HTTP_AUTHORIZATION'
    

    Do you know why? Could you please help me sort it out?

    Thank you, Andrew

    opened by mandrewstuart 13
  • request.forms.var returns None if not ascii chars are sent

    request.forms.var returns None if not ascii chars are sent

    Hi, If I query the request.forms parameters where not only ascii characters are submitted it return None, instead of the value (encoded or not encoded)

    print(request.forms.myvar) gives None, while print(request.forms.get('myvar')) gives 'óüöúő'

    I'm using bottle 0.13-dev

    Bug 
    opened by boumboum 12
  • Using JavaScript MQTT over websockets client within Bottle

    Using JavaScript MQTT over websockets client within Bottle

    First, many thanks to the developers for creating Bottle. I've found it easy to use.

    Is there an active forum where I can ask for ideas? I wondering if it would be possible to add user code to subscribe to MQTT and receive messages so it can display data in real time? Maybe a template could use javascript? A search has found JavaScript MQTT over websockets client.

    Alan

    opened by alan-rpi 0
  • "cgi" standard library module used by bottle is deprecated in Python 3.11, to be removed in 3.13

    I'm running bottle with Python 3.11 for the first time and I see this deprecation warning:

    /xxx/lib/bottle/bottle.py:72: DeprecationWarning: 'cgi' is deprecated and slated for removal in Python 3.13
      import base64, calendar, cgi, email.utils, functools, hmac, itertools,\
    

    I guess bottle needs to stop using this module?

    opened by liyanage 1
  • Backport fixes for #1155 and #1194 catastrophic regex backtracking issues to the 0.12 release branch

    Backport fixes for #1155 and #1194 catastrophic regex backtracking issues to the 0.12 release branch

    Hello, this change is intended to resolve these issues for those using the officially released 0.12 branch. I've verified both of the fixes as outlined in the two commits here, adapting the changes to the older branch.

    opened by kujenga 0
  • Log with logging instead of stdout/stderr

    Log with logging instead of stdout/stderr

    Is there an option to make bottle use the Python built-in logging package instead of stderr/stdout?

    Here is a basic example, would you see how to redirect the "Bottle v0.12.23 server starting up (using WSGIRefServer())... Listening on http://localhost:8080/ Hit Ctrl-C to quit." information to logging, as well as the different requests logs?

    import logging
    logging.basicConfig(level=logging.INFO)
    logger = logging.getLogger("bottle_server")
    logger.info("hello world!")
    
    from bottle import route, run, template
    
    @route('/')
    def index():
        return "hhello"
    
    run(host='localhost', port=8080)
    

    It would also have the benefit to avoid the issue of not being able to use bottle with pythonw (which has no stderr/stdout), as seen in https://github.com/bottlepy/bottle/issues/1104#issuecomment-1195529160.

    opened by josephernest 10
  • fix tests RuntimeWarning

    fix tests RuntimeWarning

    When running tests, the following warnings appeared

    test/test_router.py::TestRouter::testFloatFilter
    test/test_router.py::TestRouterInCGIMode::testFloatFilter
      /Users/dani/bottle/bottle.py:419: RuntimeWarning: Route <GET /object/<id:float>> overwrites a previously defined route
        warnings.warn(msg % (method, rule), RuntimeWarning)
    
    test/test_router.py::TestRouter::testParentheses
    test/test_router.py::TestRouterInCGIMode::testParentheses
      /Users/dani/bottle/bottle.py:419: RuntimeWarning: Route <GET /func2(:param#(foo|bar)#)> overwrites a previously defined route
        warnings.warn(msg % (method, rule), RuntimeWarning)
    

    These seem to me to be purely an artifact of the way the tests were written, so I updated the route name for the tests. This removes the warning and (I believe) keep the test integrity.

    opened by clavedeluna 0
Owner
Bottle Micro Web Framework
Bottle Micro Web Framework
The Python micro framework for building web applications.

Flask Flask is a lightweight WSGI web application framework. It is designed to make getting started quick and easy, with the ability to scale up to co

The Pallets Projects 61.5k Jan 6, 2023
A micro web-framework using asyncio coroutines and chained middleware.

Growler master ' dev Growler is a web framework built atop asyncio, the asynchronous library described in PEP 3156 and added to the standard library i

null 687 Nov 27, 2022
Pyrin is an application framework built on top of Flask micro-framework to make life easier for developers who want to develop an enterprise application using Flask

Pyrin A rich, fast, performant and easy to use application framework to build apps using Flask on top of it. Pyrin is an application framework built o

Mohamad Nobakht 10 Jan 25, 2022
Async Python 3.6+ web server/framework | Build fast. Run fast.

Sanic | Build fast. Run fast. Build Docs Package Support Stats Sanic is a Python 3.6+ web server and web framework that's written to go fast. It allow

Sanic Community Organization 16.7k Jan 8, 2023
Async Python 3.6+ web server/framework | Build fast. Run fast.

Sanic | Build fast. Run fast. Build Docs Package Support Stats Sanic is a Python 3.6+ web server and web framework that's written to go fast. It allow

Sanic Community Organization 16.7k Dec 28, 2022
A proof-of-concept CherryPy inspired Python micro framework

Varmkorv Varmkorv is a CherryPy inspired micro framework using Werkzeug. This is just a proof of concept. You are free to use it if you like, or find

Magnus Karlsson 1 Nov 22, 2021
Bromelia-hss implements an HSS by using the Python micro framework Bromélia.

Bromélia HSS bromelia-hss is the second official implementation of a Diameter-based protocol application by using the Python micro framework Bromélia.

henriquemr 7 Nov 2, 2022
Free and open source full-stack enterprise framework for agile development of secure database-driven web-based applications, written and programmable in Python.

Readme web2py is a free open source full-stack framework for rapid development of fast, scalable, secure and portable database-driven web-based applic

null 2k Dec 31, 2022
Sierra is a lightweight Python framework for building and integrating web applications

A lightweight Python framework for building and Integrating Web Applications. Sierra is a Python3 library for building and integrating web applications with HTML and CSS using simple enough syntax. You can develop your web applications with Python, taking advantage of its functionalities and integrating them to the fullest.

null 83 Sep 23, 2022
web.py is a web framework for python that is as simple as it is powerful.

web.py is a web framework for Python that is as simple as it is powerful. Visit http://webpy.org/ for more information. The latest stable release 0.62

null 5.8k Dec 30, 2022
Bionic is Python Framework for crafting beautiful, fast user experiences for web and is free and open source

Bionic is fast. It's powered core python without any extra dependencies. Bionic offers stateful hot reload, allowing you to make changes to your code and see the results instantly without restarting your app or losing its state.

 ⚓ 0 Mar 5, 2022
Fast, asynchronous and elegant Python web framework.

Warning: This project is being completely re-written. If you're curious about the progress, reach me on Slack. Vibora is a fast, asynchronous and eleg

vibora.io 5.7k Jan 8, 2023
Appier is an object-oriented Python web framework built for super fast app development.

Joyful Python Web App development Appier is an object-oriented Python web framework built for super fast app development. It's as lightweight as possi

Hive Solutions 122 Dec 22, 2022
FPS, fast pluggable server, is a framework designed to compose and run a web-server based on plugins.

FPS, fast pluggable server, is a framework designed to compose and run a web-server based on plugins. It is based on top of fastAPI, uvicorn, typer, and pluggy.

Adrien Delsalle 1 Nov 16, 2021
Ape is a framework for Web3 Python applications and smart contracts, with advanced functionality for testing, deployment, and on-chain interactions.

Ape Framework Ape is a framework for Web3 Python applications and smart contracts, with advanced functionality for testing, deployment, and on-chain i

ApeWorX Ltd. 552 Dec 30, 2022
Asita is a web application framework for python based on express-js framework.

Asita is a web application framework for python. It is designed to be easy to use and be more easy for javascript users to use python frameworks because it is based on express-js framework.

Mattéo 4 Nov 16, 2021
A high-level framework for building GitHub applications in Python.

A high-level framework for building GitHub applications in Python. Core Features Async Proper ratelimit handling Handles interactions for you (

Vish M 3 Apr 12, 2022
A minimal, extensible, fast and productive API framework for Python 3.

molten A minimal, extensible, fast and productive API framework for Python 3. Changelog: https://moltenframework.com/changelog.html Community: https:/

Bogdan Popa 980 Nov 28, 2022
TinyAPI - 🔹 A fast & easy and lightweight WSGI Framework for Python

TinyAPI - ?? A fast & easy and lightweight WSGI Framework for Python

xArty 3 Apr 8, 2022