222👍
Or you can write your urls like this:
(r'^login/?$', 'mySite.myUser.views.login')
The question sign after the trailing slash makes it optional in regexp. Use it if for some reasons you don’t want to use APPEND_SLASH setting.
- [Django]-Suppress "?next=blah" behavior in django's login_required decorator
- [Django]-Github issues api 401, why? (django)
- [Django]-Python Django Gmail SMTP setup
23👍
This improves on @Michael Gendin’s answer. His answer serves the identical page with two separate URLs. It would be better to have login
automatically redirect to login/
, and then serve the latter as the main page:
from django.conf.urls import patterns
from django.views.generic import RedirectView
urlpatterns = patterns('',
# Redirect login to login/
(r'^login$', RedirectView.as_view(url = '/login/')),
# Handle the page with the slash.
(r'^login/', "views.my_handler"),
)
- [Django]-What is reverse()?
- [Django]-How to move a model between two Django apps (Django 1.7)
- [Django]-Django: Display Choice Value
3👍
I’ve had the same problem too. My solution was put an (|/) before the end line of my regular expression.
url(r'^artists/(?P[\d]+)(|/)$', ArtistDetailView.as_view()),
- [Django]-Django admin default filter
- [Django]-How to automate createsuperuser on django?
- [Django]-Change a Django form field to a hidden field
2👍
Append slash without redirect, use it instead of CommonMiddleware in settings, Django 2.1:
MIDDLEWARE = [
...
# 'django.middleware.common.CommonMiddleware',
'htx.middleware.CommonMiddlewareAppendSlashWithoutRedirect',
...
]
Add to your main app directory middleware.py:
from django.http import HttpResponsePermanentRedirect, HttpRequest
from django.core.handlers.base import BaseHandler
from django.middleware.common import CommonMiddleware
from django.conf import settings
class HttpSmartRedirectResponse(HttpResponsePermanentRedirect):
pass
class CommonMiddlewareAppendSlashWithoutRedirect(CommonMiddleware):
""" This class converts HttpSmartRedirectResponse to the common response
of Django view, without redirect.
"""
response_redirect_class = HttpSmartRedirectResponse
def __init__(self, *args, **kwargs):
# create django request resolver
self.handler = BaseHandler()
# prevent recursive includes
old = settings.MIDDLEWARE
name = self.__module__ + '.' + self.__class__.__name__
settings.MIDDLEWARE = [i for i in settings.MIDDLEWARE if i != name]
self.handler.load_middleware()
settings.MIDDLEWARE = old
super(CommonMiddlewareAppendSlashWithoutRedirect, self).__init__(*args, **kwargs)
def process_response(self, request, response):
response = super(CommonMiddlewareAppendSlashWithoutRedirect, self).process_response(request, response)
if isinstance(response, HttpSmartRedirectResponse):
if not request.path.endswith('/'):
request.path = request.path + '/'
# we don't need query string in path_info because it's in request.GET already
request.path_info = request.path
response = self.handler.get_response(request)
return response
- [Django]-How to remove all of the data in a table using Django
- [Django]-Testing nginx without domain name
- [Django]-How do I remove Label text in Django generated form?
1👍
In some cases, we have issues when some of our users call API with different endings. Usually, our users use Postman for that and are not worried about slash at the endpoint. As result, we receive issue requests in support, because users forgot to append a slash /
at the end of POST requests.
We solved it by using a custom middleware that works for us in Django 3.2+ and Django 4.0+. After that, Django may handle any POST/PUT/DELETE requests to your API with slash or without them. With this middleware unneeded to change APPEND_SLASH
property in settings.py
So, in the settings.py
need to remove your current 'django.middleware.common.CommonMiddleware'
and insert new middleware. Make sure, you change your_project_name
in my example below on your real project name.
MIDDLEWARE = [
...
# 'django.middleware.common.CommonMiddleware',
'your_project_name.middleware.CommonMiddlewareAppendSlashWithoutRedirect',
...
]
Add to your main app directory middleware.py:
from django.http import HttpResponsePermanentRedirect, HttpRequest
from django.core.handlers.base import BaseHandler
from django.middleware.common import CommonMiddleware
from django.utils.http import escape_leading_slashes
from django.conf import settings
class HttpSmartRedirectResponse(HttpResponsePermanentRedirect):
pass
class CommonMiddlewareAppendSlashWithoutRedirect(CommonMiddleware):
""" This class converts HttpSmartRedirectResponse to the common response
of Django view, without redirect. This is necessary to match status_codes
for urls like /url?q=1 and /url/?q=1. If you don't use it, you will have 302
code always on pages without slash.
"""
response_redirect_class = HttpSmartRedirectResponse
def __init__(self, *args, **kwargs):
# create django request resolver
self.handler = BaseHandler()
# prevent recursive includes
old = settings.MIDDLEWARE
name = self.__module__ + '.' + self.__class__.__name__
settings.MIDDLEWARE = [i for i in settings.MIDDLEWARE if i != name]
self.handler.load_middleware()
settings.MIDDLEWARE = old
super(CommonMiddlewareAppendSlashWithoutRedirect, self).__init__(*args, **kwargs)
def get_full_path_with_slash(self, request):
""" Return the full path of the request with a trailing slash appended
without Exception in Debug mode
"""
new_path = request.get_full_path(force_append_slash=True)
# Prevent construction of scheme relative urls.
new_path = escape_leading_slashes(new_path)
return new_path
def process_response(self, request, response):
response = super(CommonMiddlewareAppendSlashWithoutRedirect, self).process_response(request, response)
if isinstance(response, HttpSmartRedirectResponse):
if not request.path.endswith('/'):
request.path = request.path + '/'
# we don't need query string in path_info because it's in request.GET already
request.path_info = request.path
response = self.handler.get_response(request)
return response
This answer may look similar to Max Tkachenko answer. But his code didn’t work for me in the latest versions of Django.
- [Django]-Login Page by using django forms
- [Django]-Referencing multiple submit buttons in django
- [Django]-How do I use CSS in Django?
0👍
I’ve had the same problem. In my case it was a stale leftover from some old version in urls.py, from before staticfiles:
url(r'^%s(?P<path>.*)$' % settings.MEDIA_URL.lstrip('/'),
'django.views.static.serve',
kwargs={'document_root': settings.MEDIA_ROOT}),
MEDIA_URL was empty, so this pattern matched everything.
- [Django]-How do I use pagination with Django class based generic ListViews?
- [Django]-Django – No module named _sqlite3
- [Django]-Auto-create primary key used when not defining a primary key type warning in Django
0👍
In your Django project’s settings file (settings.py), make sure the APPEND_SLASH setting is set to True:
APPEND_SLASH = True
Next, add the CommonMiddleware to the MIDDLEWARE setting:
MIDDLEWARE = [
# other middleware classes...
'django.middleware.common.CommonMiddleware',
# other middleware classes...
]
With this configuration, Django’s CommonMiddleware will automatically handle URL redirection and add or remove the trailing slash as needed. This means that requests to both ‘xyz/’ and ‘xyz’ will be correctly processed by Django REST Framework.
Note – When making requests, it is generally recommended to include the trailing slash to conform to RESTful conventions. However, with the above configuration, requests without the trailing slash will still work as expected.
- [Django]-Navigation in django
- [Django]-Best practices for getting the most testing coverage with Django/Python?
- [Django]-Getting Django admin url for an object
0👍
You can use this snippet
from django.urls import re_path, path
from django.urls.resolvers import _route_to_regex
def tr_path(route, view, *args, **kwargs):
if callable(view):
r = _route_to_regex(route)
if r[0][-1] != '/':
new_route = r[0] + '/?$' # add trailed slash
return re_path(new_route, view, *args, **kwargs)
return path(route, view, *args, **kwargs)
then replace your path
totr_path
- [Django]-Django – filtering on foreign key properties
- [Django]-How to pull a random record using Django's ORM?
- [Django]-Django 1.10.1 'my_templatetag' is not a registered tag library. Must be one of: