Frequently Asked Questions about Hug
For more examples, check out Hug's documentation and examples Github directories, and its website.
General Questions
Q: Can I use Hug with a web framework -- Django for example?
A: You can use Hug alongside Django or the web framework of your choice, but it does have drawbacks. You would need to run hug on a separate, hug-exclusive server. You can also mount Hug as a WSGI app, embedded within your normal Django app.
Q: Is Hug compatabile with Python 2?
A: Python 2 is not supported by Hug. However, if you need to account for backwards compatability, there are workarounds. For example, you can wrap the decorators:
def my_get_fn(func, *args, **kwargs): if 'hug' in globals(): return hug.get(func, *args, **kwargs) return func
Technical Questions
Q: I need to ensure the security of my data. Can Hug be used over HTTPS?
A: Not directly, but you can utilize uWSGI with nginx to transmit sensitive data. HTTPS is not part of the standard WSGI application layer, so you must use a WSGI HTTP server (such as uWSGI) to run in production. With this setup, Nginx handles SSL connections, and transfers requests to uWSGI.
Q: How can I serve static files from a directory using Hug?
A: For a static HTML page, you can just set the proper output format as: output=hug.output_format.html
. To see other examples, check out the html_serve example, the image_serve example, and the more general static_serve example within hug/examples
.
Most basic examples will use a format that looks something like this:
@hug.static('/static') def my_static_dirs():  return('/home/www/path-to-static-dir')
Q: Does Hug support autoreloading?
A: Hug supports any WSGI server that uses autoreloading, for example Gunicorn and uWSGI. The scripts for initializing autoreload for them are, respectively:
Gunicorn: gunicorn --reload app:__hug_wsgi__
uWSGI: --py-autoreload 1 --http :8000 -w app:__hug_wsgi__
Q: How can I access a list of my routes?
A: You can access a list of your routes by using the routes object on the HTTP API:
__hug_wsgi__.http.routes
It will return to you a structure of "base_url -> url -> HTTP method -> Version -> Python Handler". Therefore, for example, if you have no base_url set and you want to see the list of all URLS, you could run:
__hug_wsgi__.http.routes[''].keys()
Q: How can I configure a unique 404 route?
A: By default, Hug will call documentation_404()
if no HTTP route is found. However, if you want to configure other options (such as routing to a directiory, or routing everything else to a landing page) you can use the @hug.sink('/')
decorator to create a "catch-all" route:
import hug @hug.sink('/all') def my_sink(request): return request.path.replace('/all', '')
For more information, check out the ROUTING.md file within the hug/documentation
directory.
Q: How can I enable CORS
A: There are many solutions depending on the specifics of your application. For most applications, you can use the included cors middleware:
import hug api = hug.API(__name__) api.http.add_middleware(hug.middleware.CORSMiddleware(api, max_age=10)) @hug.get("/demo") def get_demo(): return {"result": "Hello World"}
For cases that are more complex then the middleware handles
This comment (and the discussion around it) give a good starting off point.