Useful django app and utils to develop large-scale web app
- Python (2.7)
- Django (1.8, 1.9)
Install using pip
...
pip install djangopatchy
Let's add a middleware to calculate the time elapse for each request
- Add a middleware at the top:
MIDDLEWARE_CLASSES = (
'patchy.middleware.LongRequestMiddleware',
...
)
- Add logger handler with
pathcy.middleware
:
Example:
'patchy.middleware': {
'handlers': ['sentry'],
'level': 'ERROR',
'propagate': True
}
- Set the timeout threshold in settings(default to 1 second):
PATCHY_LONG_REQUEST_TIMEOUT = 2 # set the timeout to 2 seconds
Results:
- For each web request, it has a header variable
X-ELAPSED
in seconds to indicate the time elapse.
X-ELAPSED: 0.005 # it means the request costs 5 ms
- If it exceeds the
PATCHY_LONG_REQUEST_TIMEOUT
a error log message will be sent.
- Add some urls to ignore list(optional), regular expression is supported.
PATCHY_LONG_REQUEST_IGNORE_URLS = [
r'^/_admin/.*$',
]
Let us rewrite the CursorWrapper.execute to calculate the sql process time
- Add the python snippets in the
djangoproject/__init__.py
# rewrite the sql operation method
from django.db.backends import utils
from patchy.utils import long_sql_execute_wrapper
utils.CursorWrapper.execute = long_sql_execute_wrapper
- Add logger handler with
pathcy.utils
:
Example:
'patchy.utils': {
'handlers': ['sentry'],
'level': 'ERROR',
'propagate': True
}
- Set the timeout threshold in settings(default to 0.05 seond, which is 50 miliseconds):
PATCHY_LONG_SQL_TIMEOUT = 0.01 # set the timeout to 10 miliseconds
Result:
- If the sql operation exceeds the
PATCHY_LONG_SQL_TIMEOUT
a error log message will be sent.
- no_sql_monitoring
no_sql_monitoring
is a decorator for wrapping code to skip sql monitoring.
from patchy.utils import no_sql_monitoring
@no_sql_monitoring
def transaction_status(request, transaction_no):
transaction = Transaction.objects.get(transaction_no=transaction_no)
return ResponseBuilder.build_success_json_response(
msg='查询订单成功',
data={
'transaction_no': transaction_no,
'transaction_status': transaction.transaction_status
})