Django admin returns 404 on POST, 200 on GET

前端 未结 2 1989
抹茶落季
抹茶落季 2020-12-16 15:08

On production server, when I try to edit/create an object then saving fails, returning 404. This only occurs for POST requests, GET requests (loading the page) work fine. Dj

相关标签:
2条回答
  • 2020-12-16 15:58

    I never got to the bottom of this, but I have developed a workaround that allows the forms to function.

    1. Edit _get_response(self, request) in django.core.handlers.base. Change resolver_match = resolver.resolve(request.path_info) to resolver_match = resolver.resolve(request.path).

    2. Add this middleware (adjust to your exact needs):

       class ImageField404Middleware:
           def __init__(self, get_response):
               self.get_response = get_response
      
           def __call__(self, request):
               response = self.get_response(request)
      
               if (request.method == 'POST' and request.user.is_superuser and response.status_code == 302
                       and request.get_full_path().startswith('/pathtoadmin/')):
                   post_messages = get_messages(request)
                   for message in post_messages:
                       if ('was added successfully' in message.message or 'was changed successfully' in message.message
                               and message.level == message_levels.SUCCESS):
                           messages.success(request, message.message)
                           redirect_url = request.get_full_path()
                           if '_addanother' in request.POST:
                               redirect_url = re.sub(r'[^/]*/[^/]*/$', 'add/', redirect_url)
                           elif '_save' in request.POST:
                               redirect_url = re.sub(r'[^/]*/[^/]*/(\?.*)?$', '', redirect_url) 
                               if '_changelist_filters' in request.GET:
                                   preserved_filters = parse.parse_qsl(request.GET['_changelist_filters'])
                                   redirect_url += '?' + parse.urlencode(preserved_filters)         
                           elif '_continue' in request.POST:
                               redirect_url_search = re.search(r'((?<=href=)[^>]*)', message.message)    
                               if redirect_url_search:                                                  
                                   redirect_url = redirect_url_search.group(0)                                                  
                                   redirect_url = re.sub(r'[\\"]*', '', redirect_url).replace('/pathtoadmin/pathtoadmin/', '/pathtoadmin/')
                           return HttpResponseRedirect(redirect_url)
      
               return response
      

    Not ideal by any means, but works for me at the moment.

    I believe these problems may, in part at least, be caused by ModSecurity Apache. Some problems I had went away after the hosting provider later reconfigured this.

    You can read more details here: https://medium.com/@mnydigital/how-to-resolve-django-admin-404-post-error-966ce0dcd39d

    0 讨论(0)
  • 2020-12-16 16:00

    Have you activated middleware (Internationalization: in URL patterns)?

    # settings.py
    MIDDLEWARE = [
    ...
    'django.middleware.locale.LocaleMiddleware'
    ...
    ]
    
    0 讨论(0)
提交回复
热议问题