Configuration¶
Settings¶
Qval supports configuration via config files and environmental variables.
If DJANGO_SETTINGS_MODULE or SETTINGS_MODULE is defined, the specified config module will be used. Otherwise,
all lookups will be done in os.environ.
Supported variables:
QVAL_MAKE_REQUEST_WRAPPER = myapp.myfile.my_func. Customizes the behavior of themake_request()function, which is applied to all incoming requests. The result of this function is then passed toqval.qval.QueryParamValidator. The provided function must acceptrequestand return an object that supports the request interface (seeDummyRequest).For example, the following code adds a print to eachmake_request()call:# app/utils.py def my_wrapper(f): @functools.wraps(f) def wrapper(request): print(f"Received a new request: {request}") return f(request) return wrapper
You will also need to set the environment variableexport QVAL_MAKE_REQUEST_WRAPPER=app.utils.my_wrapperin your terminal or add it to the used config file.@qval()will use it to determine whether the first or second argument is the request.QVAL_REQUEST_CLASS = path.to.CustomRequestClass.@qval()will use it to determine which argument is the request. If you have a custom request class that implementsDummyRequest()interface, provide it with this variable.
Logging¶
Qval uses a global object called log for reporting errors. Here is an example error message:
An error occurred during the validation or inside the context: exc `<class 'OverflowError'>` ((34, 'Numerical result out of range')).
| Parameters: <QueryDict: {'a': ['2.2324'], 'b': ['30000000']}>
| Body : b''
| Exception:
Traceback (most recent call last):
File "<path>/qval/qval.py", line 338, in inner
return f(*args, params, **kwargs)
File "<path>/examples/django-example/app/views.py", line 46, in pow_view
return JsonResponse({"answer": params.a ** params.b})
OverflowError: (34, 'Numerical result out of range')
Internal Server Error: /api/pow
[19/Nov/2018 07:03:15] "GET /api/pow?a=2.2324&b=30000000 HTTP/1.1" 500 102
You can disable the logging entirely by calling log.disable().