Круговой импорт в Django 2 python "urls" файл - PullRequest
1 голос
/ 11 марта 2019

У меня есть запрос API входа в систему с использованием инфраструктуры Django, но ошибка в " циклическом импорте " ошибок шаблонов URL. пожалуйста, кто-нибудь, дайте нам решение относительно пункта.

Ошибка записи журнала в файл журнала:

[Sun Mar 10 20:30:47.407794 2019] [wsgi:error] [pid 21457:tid 139659590813440] Internal Server Error: /ai_chat_bot/users/login
[Sun Mar 10 20:30:47.407814 2019] [wsgi:error] [pid 21457:tid 139659590813440] Traceback (most recent call last):
[Sun Mar 10 20:30:47.407816 2019] [wsgi:error] [pid 21457:tid 139659590813440]   File "/opt/python/ai_rest_env/lib/python3.5/site-packages/django/urls/resolvers.py", line 542, in url_patterns
[Sun Mar 10 20:30:47.407818 2019] [wsgi:error] [pid 21457:tid 139659590813440]     iter(patterns)
[Sun Mar 10 20:30:47.407819 2019] [wsgi:error] [pid 21457:tid 139659590813440] TypeError: 'module' object is not iterable
[Sun Mar 10 20:30:47.407821 2019] [wsgi:error] [pid 21457:tid 139659590813440] 
[Sun Mar 10 20:30:47.407822 2019] [wsgi:error] [pid 21457:tid 139659590813440] During handling of the above exception, another exception occurred:
[Sun Mar 10 20:30:47.407823 2019] [wsgi:error] [pid 21457:tid 139659590813440] 
[Sun Mar 10 20:30:47.407825 2019] [wsgi:error] [pid 21457:tid 139659590813440] Traceback (most recent call last):
[Sun Mar 10 20:30:47.407826 2019] [wsgi:error] [pid 21457:tid 139659590813440]   File "/opt/python/ai_rest_env/lib/python3.5/site-packages/django/core/handlers/exception.py", line 35, in inner
[Sun Mar 10 20:30:47.407828 2019] [wsgi:error] [pid 21457:tid 139659590813440]     response = get_response(request)
[Sun Mar 10 20:30:47.407829 2019] [wsgi:error] [pid 21457:tid 139659590813440]   File "/opt/python/ai_rest_env/lib/python3.5/site-packages/django/utils/deprecation.py", line 93, in __call__
[Sun Mar 10 20:30:47.407831 2019] [wsgi:error] [pid 21457:tid 139659590813440]     response = self.process_request(request)
[Sun Mar 10 20:30:47.407832 2019] [wsgi:error] [pid 21457:tid 139659590813440]   File "/opt/python/ai_rest_env/lib/python3.5/site-packages/django/middleware/common.py", line 60, in process_request
[Sun Mar 10 20:30:47.407834 2019] [wsgi:error] [pid 21457:tid 139659590813440]     if self.should_redirect_with_slash(request):
[Sun Mar 10 20:30:47.407835 2019] [wsgi:error] [pid 21457:tid 139659590813440]   File "/opt/python/ai_rest_env/lib/python3.5/site-packages/django/middleware/common.py", line 78, in should_redirect_with_slash
[Sun Mar 10 20:30:47.407837 2019] [wsgi:error] [pid 21457:tid 139659590813440]     not is_valid_path(request.path_info, urlconf) and
[Sun Mar 10 20:30:47.407838 2019] [wsgi:error] [pid 21457:tid 139659590813440]   File "/opt/python/ai_rest_env/lib/python3.5/site-packages/django/urls/base.py", line 157, in is_valid_path
[Sun Mar 10 20:30:47.407840 2019] [wsgi:error] [pid 21457:tid 139659590813440]     resolve(path, urlconf)
[Sun Mar 10 20:30:47.407841 2019] [wsgi:error] [pid 21457:tid 139659590813440]   File "/opt/python/ai_rest_env/lib/python3.5/site-packages/django/urls/base.py", line 24, in resolve
[Sun Mar 10 20:30:47.407843 2019] [wsgi:error] [pid 21457:tid 139659590813440]     return get_resolver(urlconf).resolve(path)
[Sun Mar 10 20:30:47.407844 2019] [wsgi:error] [pid 21457:tid 139659590813440]   File "/opt/python/ai_rest_env/lib/python3.5/site-packages/django/urls/resolvers.py", line 498, in resolve
[Sun Mar 10 20:30:47.407845 2019] [wsgi:error] [pid 21457:tid 139659590813440]     for pattern in self.url_patterns:
[Sun Mar 10 20:30:47.407856 2019] [wsgi:error] [pid 21457:tid 139659590813440]   File "/opt/python/ai_rest_env/lib/python3.5/site-packages/django/utils/functional.py", line 36, in __get__
[Sun Mar 10 20:30:47.407858 2019] [wsgi:error] [pid 21457:tid 139659590813440]     res = instance.__dict__[self.name] = self.func(instance)
[Sun Mar 10 20:30:47.407859 2019] [wsgi:error] [pid 21457:tid 139659590813440]   File "/opt/python/ai_rest_env/lib/python3.5/site-packages/django/urls/resolvers.py", line 549, in url_patterns
[Sun Mar 10 20:30:47.407861 2019] [wsgi:error] [pid 21457:tid 139659590813440]     raise ImproperlyConfigured(msg.format(name=self.urlconf_name))
[Sun Mar 10 20:30:47.407863 2019] [wsgi:error] [pid 21457:tid 139659590813440] django.core.exceptions.ImproperlyConfigured: The included URLconf 'AI_Chatbot_Server.urls' does not appear to have any patterns in it. If you see valid patterns in the file then the issue is probably caused by a circular import.

Исходный код файла AI_Chatbot_Server.urls ':

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    # chatbot app url list
    path('ai_chat_bot/', include("apps.chatbot.urls")),
    path('ai_chat_bot/users/', include("apps.users.urls")),
    path('ai_chat_bot/weather/', include("apps.weather.urls")),
]

Update-1:

URL модуля пользователя:

from django.urls import path
from .controller import login_controller

urlpatterns = [
    path('login', login_controller.LoginController.login, name='login'),
]

URL модуля Chatbot:

from django.urls import path
from .controller import chatbot_main_controller

urlpatterns = [
    path('get_question/', chatbot_main_controller.ChatBotMainController.get_question, name="get_question"),
]

Погодный модуль usrls:

from django.urls import path

from ..weather.controller import weather_info_controller

urlpatterns = [
    path('get_weather_info/', weather_info_controller.WeatherInfoController.get_weather_info, name="get_weather_info"),
]

Update-2:

У меня есть общая папка со структурой пользователей, чатбот и модуль погоды:

    .
├─.idea
├─AI_Chatbot_Server
│  └─settings
├─apps
│  ├─chatbot
│  │  ├─ai_models
│  │  │  ├─cnn
│  │  │  │  └─temp
│  │  │  ├─estimator
│  │  │  ├─multiclass_cnn
│  │  │  │  └─temp
│  │  │  ├─multiclass_dnn
│  │  │  │  └─temp
│  │  │  └─tensorflow
│  │  ├─ai_model_handler
│  │  ├─common
│  │  ├─config
│  │  ├─controller
│  │  ├─data_processor
│  │  ├─emoji
│  │  │  ├─common
│  │  │  ├─controller
│  │  │  ├─model
│  │  │  ├─repository
│  │  │  ├─serializer
│  │  │  └─service
│  │  ├─evaluation
│  │  │  ├─controller
│  │  │  ├─model
│  │  │  ├─repository
│  │  │  ├─serializer
│  │  │  └─service
│  │  ├─keyword
│  │  │  ├─common
│  │  │  ├─controller
│  │  │  ├─helper
│  │  │  ├─logic
│  │  │  ├─models
│  │  │  ├─repository
│  │  │  ├─serializer
│  │  │  └─service
│  │  ├─models
│  │  ├─repository
│  │  ├─serializer
│  │  ├─service
│  │  ├─utils
│  │  └─validation
│  ├─common
│  ├─users
│  │  ├─common
│  │  ├─controller
│  │  ├─json
│  │  ├─model
│  │  ├─repository
│  │  ├─serializer
│  │  └─service
│  └─weather
│      ├─common
│      ├─controller
│      └─service
├─common
└─static
    ├─data
    └─resources
        └─images
            └─emoji

Update-3: Я добавил контроллер входа, пожалуйста, проверьте его.

import logging
from json.decoder import JSONDecodeError

from django.core.exceptions import ObjectDoesNotExist
from django.db.utils import IntegrityError
from django.http import JsonResponse
from rest_framework.decorators import api_view

from ..common.http_code import HttpCode
from ..common.http_message import HttpMessage
from ..common.user_constant import UserConstant
from ..common.utility import Utility
from ..json.response import Response
from ..service.login_service import LoginService
from ..service.login_service import LoginService as loginService


class LoginController:
    logger = logging.getLogger('LoginController')

    @api_view(['POST'])
    def login(request):
        LoginController.logger.info("LoginController.login : START")
        http_status_code = HttpCode.HTTP_ZERO
        post_data = None
        responseData = None
        # check valid json format & added json format exception
        try:
            post_data = Utility.convertRequestBodyToJson(request)
        except JSONDecodeError as ex:
            responseData = Response.preparedResponse(UserConstant.ERROR, str(ex.args), None)
            LoginController.logger.error(UserConstant.JSON_PARSE_ERROR + str(ex))
            http_status_code = HttpCode.HTTP_BAD_REQUEST

        # check request param
        if post_data != None:
            username = post_data['username']
            password = post_data['password']

            # check valid user & password
            try:
                try:
                    valid_user = loginService.check_username(username)
                except ObjectDoesNotExist:
                    valid_user = None

                if valid_user != None:
                    decoded_password = loginService.decoded_password(valid_user)
                    if decoded_password == password:
                        # save user access with token
                        user_access = loginService.set_user_access(valid_user)
                        if user_access != None:
                            loginService.save_user_access(user_access)
                            user_role = loginService.get_user_role(valid_user)
                            login_service = LoginService()
                            # process user_access_history data
                            # login_service.process_user_access_history(valid_user.username, user_access.token)
                            if user_role != None:
                                # prepare the user response object
                                users = {'id': valid_user.id, 'username': valid_user.username,
                                         'token': user_access.token, 'role': user_role.name,
                                         'user_image_url': valid_user.user_image_url}
                                # added common method for prepare response object
                                responseData = Response.preparedResponse(UserConstant.SUCCESS,
                                                                         UserConstant.USER_AUTHENTICATION_SUCCESSFUL,
                                                                         users)
                                http_status_code = HttpCode.HTTP_OK
                    else:
                        responseData = Response.preparedResponse(UserConstant.ERROR,
                                                                 UserConstant.INCORRECT_USER_PASSWORD, None)
                        http_status_code = HttpCode.HTTP_UNAUTHORIZED
                else:
                    responseData = Response.preparedResponse(UserConstant.ERROR, UserConstant.USER_AUTHENTICATION_FAIL,
                                                             None)
                    http_status_code = HttpCode.HTTP_UNAUTHORIZED

            except IntegrityError as ex:
                responseData = Response.preparedResponse(UserConstant.ERROR, str(ex.args), None)
                LoginController.logger.error(UserConstant.DATABASE_ERROR + str(ex))
                http_status_code = HttpCode.HTTP_INTERNAL_SERVER_ERROR
            except Exception as ex:
                LoginController.logger.error(UserConstant.ERROR + str(ex))
                responseData = Response.preparedResponse(UserConstant.ERROR, HttpMessage.INTERNAL_SERVER_ERROR, None)
                http_status_code = HttpCode.HTTP_INTERNAL_SERVER_ERROR
        LoginController.logger.info("LoginController.login : END")
        return JsonResponse(status=http_status_code, data=responseData, safe=False)

1 Ответ

0 голосов
/ 04 апреля 2019

Позвольте мне найти для вас проблему, связанную с circular import, из документации. https://docs.djangoproject.com/en/2.0/search/?q=circular+import

Ниже у меня есть список вниз и попытаться дать ответственные вещи кругового импорта. Как вы не поделились полным кодом, так что изучили документацию и перефакторили свой код. как предложено в документе. Надеюсь, это поможет.

1. Настройки

https://docs.djangoproject.com/en/2.0/ref/settings/#message-level

Если вы переопределяете MESSAGE_LEVEL в файле настроек и полагаетесь на любую из встроенных констант, вы должны импортировать модуль констант напрямую, чтобы избежать возможности циклического импорта, например ::

from django.contrib.messages import constants as message_constants
MESSAGE_LEVEL = message_constants.DEBUG

https://docs.djangoproject.com/en/2.0/ref/settings/#message-tags

Если вы переопределяете MESSAGE_TAGS в файле настроек и полагаетесь на любую из встроенных констант, вы должны импортировать модуль констант напрямую, чтобы избежать потенциального циклического импорта, например ::

from django.contrib.messages import constants as message_constants
MESSAGE_TAGS = {message_constants.INFO: ''}

2 Стиль кодирования

https://docs.djangoproject.com/en/2.0/internals/contributing/writing-code/coding-style/#imports

Вы можете запустить команду "isort -rc" для упорядоченного импорта.

3 Перевод

https://docs.djangoproject.com/en/2.0/topics/i18n/translation/#how-django-discovers-language-preference

Если вы определяете пользовательский параметр LANGUAGES, как описано в предыдущем пункте, вы можете пометить имена языков как строки перевода - но используйте gettext_lazy () вместо gettext (), чтобы избежать циклического импорта.

Вот пример файла настроек:

from django.utils.translation import gettext_lazy as _
LANGUAGES = [
    ('de', _('German')),
    ('en', _('English')),
]

4 Примечания к выпуску Django 1.7

https://docs.djangoproject.com/en/2.0/releases/1.7/#django-utils-module-loading-import-by-path

5 Ссылка на поле модели

class Car(models.Model):
    manufacturer = models.ForeignKey(
        'production.Manufacturer',
        on_delete=models.CASCADE,
    )

Этот тип ссылок, называемый ленивыми отношениями, может быть полезен при разрешении циклических зависимостей импорта между двумя приложениями.

https://docs.djangoproject.com/en/2.0/ref/models/fields/#foreignkey

6. Модельные сигналы

https://docs.djangoproject.com/en/2.0/ref/signals/

7. Настройка аутентификации в Django

https://docs.djangoproject.com/en/2.0/topics/auth/customizing/#changing-to-a-custom-user-model-mid-project

8. Расширенные темы тестирования

https://docs.djangoproject.com/en/2.0/topics/testing/advanced/#controlling-creation-order-for-test-databases

9. Миграции

https://docs.djangoproject.com/en/2.0/topics/migrations/#squashing-migrations

Могут быть и другие проблемы, но они могут вам немного помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...