AssertionError: .accepted_renderer not set on Response
出錯原因,沒有在合法的方法內使用 response 響應,之前在dispatch內直接return 了,導致報錯,return response 必須放在 get post 等方法內。
按道理講,django視圖會先經過dispatch分發,如果我們在分發的時候發現權限問題,那么提前響應應該沒問題,那么為啥會報錯呢?
報錯信息顯示accepted_renderer沒有在Response內設定,找一下源碼,如下(具體原因都在下面代碼后面的注釋里了):
def dispatch(self, request, *args, **kwargs): """ `.dispatch()` is pretty much the same as Django's regular dispatch, but with extra hooks for startup, finalize, and exception handling. """ self.args = args self.kwargs = kwargs request = self.initialize_request(request, *args, **kwargs) self.request = request self.headers = self.default_response_headers # deprecate? try: self.initial(request, *args, **kwargs) # Get the appropriate handler method if request.method.lower() in self.http_method_names: handler = getattr(self, request.method.lower(), self.http_method_not_allowed) else: handler = self.http_method_not_allowed response = handler(request, *args, **kwargs) # 這里發現了,請求響應是在dispatch方法內部完成的,響應也是dispatch代為返回的,到這里也沒問題,問題在下面。 except Exception as exc: response = self.handle_exception(exc) self.response = self.finalize_response(request, response, *args, **kwargs) # 在響應之前,dispatch對視圖方法返回的響應又加工了一次 return self.response def finalize_response(self, request, response, *args, **kwargs): """ Returns the final response object. """ # Make the error obvious if a proper response is not returned assert isinstance(response, HttpResponseBase), ( 'Expected a `Response`, `HttpResponse` or `HttpStreamingResponse` ' 'to be returned from the view, but received a `%s`' % type(response) ) if isinstance(response, Response): if not getattr(request, 'accepted_renderer', None): neg = self.perform_content_negotiation(request, force=True) request.accepted_renderer, request.accepted_media_type = neg response.accepted_renderer = request.accepted_renderer # 這里,Response 會定義一個屬性 accepted_renderer,也就是說,視圖響應的不僅僅是一個 Response,而是加工過的Response,所以如果在dispatch內直接響應Response,就是跳過了后面加工哪一步,就會報錯。 response.accepted_media_type = request.accepted_media_type response.renderer_context = self.get_renderer_context() for key, value in self.headers.items(): response[key] = value return response
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
出錯原因,兩個,第一,相關包沒有安裝或者版本有問題;第二,在不合適的地方使用了項目的model模型,版本不同情況不一樣。
XXX doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported
出錯原因,在不合適的地方導用了model,如本次是在 app.__init__.py中導入本app的model導致的
虛擬環境中,Python庫的安裝直接使用pip安裝,不用加sudo,不然項目沒有權限使用該庫,會導致出現 Apps aren't loaded yet.