-1👍
As I know it, you define your Django view using a number of methods like:
def detail(request, some_param):
# [...]
The parameter request
contains information about the HTTP request. request.META['HTTP_X_FORWARDED_FOR']
for example, returns the client’s IP address.
If your plugin has something to do with requests, its classes and function probably will be instantiated/called from your view. This means you need to pass it the current request
object, as it makes no sense to have a global request object around.
In PHP, this is possible, as every request causes the whole code to be executed from scratch, but in Django requests are dispatched by a server and passed around in the framework using HttpRequest
objects. Also refer to this part of the Django documentation for more information.
23👍
Django doesn’t provide a global request object (it would actually be a thread local, not a global). But there are a few techniques you can use to get the same effect yourself: http://nedbatchelder.com/blog/201008/global_django_requests.html
- How do I convert kilometres to degrees in Geodjango/GEOS?
- In django, is there a way to directly annotate a query with a related object in single query?
4👍
AFAIK it is not available, except you make it available.
You can copy+paste the snippets provided in the other answers, or you can use this library: https://pypi.python.org/pypi/django-crequest
Middleware to make current request always available.
- How does this Man-In-The-Middle attack work?
- How to add attributes to option tags?
- Celery – No module named five
- Django: Check for related objects and whether it contains data
- How to make Django Password Reset Email Beautiful HTML?
1👍
you can attach it to current request via middleware and retrieve it back
https://github.com/jedie/django-tools/blob/master/django_tools/middlewares/ThreadLocal.py
- Django __call__() missing 1 required keyword-only argument: 'manager'
- Sending a message to a single user using django-channels
- Change default Django REST Framework home page title
- Django Test Client post() returns 302 despite error on view's post()
1👍
Based on Ned Batchelder’s reply I’ve compiled a solution. Although I wouldn’t recommend it for anything but debugging/troubleshooting. There’s a better solution on the linked page.
Put module m1
at a project root:
import inspect
def get_request():
for f in inspect.stack():
f_code = inspect.getmembers(f.frame, inspect.iscode)[0][1]
f_locals = [v for (n, v) in inspect.getmembers(f.frame) if n == 'f_locals'][0]
co_varnames = [v for (n, v) in inspect.getmembers(f_code) if n == 'co_varnames'][0]
if 'request' in co_varnames:
return f_locals['request']
Then in any other file:
import m1
print(m1.get_response().path)
You might want to make sure you don’t introduce reference cycles. I haven’t understood under which particular conditions I must do what exactly. Not that it matters in my case. But your mileage might vary.
- Django template tag: How to send next_page in {url auth_logout}?
- How to download a filefield file in django view
- {% load static %} and {% load staticfiles %}: which is preferred?
- Django global variable
0👍
One solution is django-middleware-global-request
.
It provides a way to get the request from anywhere once the request has been constructed by Django in the first place. It returns None
if no request object is available, for example when running in a manage.py shell
.
- How to assign to a Django PointField model attribute?
- How does use_for_related_fields work in Django?
- Is there a way to generate pdf containing non-ascii symbols with pisa from django template?
- Remove padding from matplotlib plotting