在将 python2 项目移植到 python3 时,mobileesp 的中间件出现错误

Posted

技术标签:

【中文标题】在将 python2 项目移植到 python3 时,mobileesp 的中间件出现错误【英文标题】:Getting Error in middleware for the mobileesp While porting python2 project to python3 【发布时间】:2020-01-17 03:42:32 【问题描述】:

在将带有 Django 1.1.11 的 python2 项目移植到 python 3.7 和 Django 2.2.5 时,我在依赖项中遇到错误。

我在 python2 中使用 Django-mobileesp,当我将代码更新到 python3 时,它会为 UserAgent 的中间件提供错误。

线程 django-main-thread 中的异常: 回溯(最近一次通话最后): _bootstrap_inner 中的文件“/usr/lib/python3.7/threading.py”,第 917 行 自我运行() 文件“/usr/lib/python3.7/threading.py”,第 865 行,运行中 self._target(*self._args, **self._kwargs) 包装器中的文件“/home/jarvis/Desktop/law3/lib/python3.7/site-packages/django/utils/autoreload.py”,第 54 行 fn(*args, **kwargs) 文件“/home/jarvis/Desktop/law3/lib/python3.7/site-packages/django/core/management/commands/runserver.py”,第 137 行,inner_run handler = self.get_handler(*args, **options) 文件“/home/jarvis/Desktop/law3/lib/python3.7/site-packages/django/contrib/staticfiles/management/commands/runserver.py”,第 27 行,在 get_handler handler = super().get_handler(*args, **options) 文件“/home/jarvis/Desktop/law3/lib/python3.7/site-packages/django/core/management/commands/runserver.py”,第 64 行,在 get_handler 返回 get_internal_wsgi_application() 文件“/home/jarvis/Desktop/law3/lib/python3.7/site-packages/django/core/servers/basehttp.py”,第 45 行,在 get_internal_wsgi_application 返回 import_string(app_path) 文件“/home/jarvis/Desktop/law3/lib/python3.7/site-packages/django/utils/module_loading.py”,第 17 行,在 import_string 模块 = 导入模块(模块路径) 文件“/home/jarvis/Desktop/law3/lib/python3.7/importlib/init.py”,第 127 行,在 import_module return _bootstrap._gcd_import(name[level:], package, level) _gcd_import 中的文件“”,第 1006 行 文件“”,第 983 行,在 _find_and_load 文件“”,第 967 行,在 _find_and_load_unlocked _load_unlocked 中的文件“”,第 677 行 文件“”,第 728 行,在 exec_module _call_with_frames_removed 中的文件“”,第 219 行 文件“/home/jarvis/Desktop/law3/src/lawersify/wsgi.py”,第 5 行,在 应用程序 = get_wsgi_application() 文件“/home/jarvis/Desktop/law3/lib/python3.7/site-packages/django/core/wsgi.py”,第 13 行,在 get_wsgi_application 返回 WSGIHandler() init 中的文件“/home/jarvis/Desktop/law3/lib/python3.7/site-packages/django/core/handlers/wsgi.py”,第 135 行 self.load_middleware() 文件“/home/jarvis/Desktop/law3/lib/python3.7/site-packages/django/core/handlers/base.py”,第 37 行,在 load_middleware mw_instance = 中间件(处理程序) TypeError: UserAgentDetectionMiddleware() 没有参数

settings.py

MIDDLEWARE =  [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'django_mobileesp.middleware.UserAgentDetectionMiddleware'
]


#middleware.py#

from django.conf import settings
from django.utils.functional import SimpleLazyObject

DETECT_USER_AGENTS = getattr(settings, 'DETECT_USER_AGENTS', )

def lazy_detection(request, key):
    detector = DETECT_USER_AGENTS[key]
    return SimpleLazyObject( lambda: detector(request) )


class UserAgentDetectionMiddleware(object):
    """
    Middleware to detect request's user agent
    """
    def process_request(self, request):
        for each in DETECT_USER_AGENTS:
            setattr( request, each, lazy_detection(request, each) )

【问题讨论】:

【参考方案1】:

这不是 Python 版本问题,而是 Django 版本问题。在 Django 2.0 中删除了旧的(Django 1.10 之前的)中间件方式以及 MIDDLEWARE_CLASSES 设置。请参阅the docs,了解如何使您的中间件与新的中间件结构兼容。

【讨论】:

先生,我已经相应地更改了中间件,但问题仍然存在。

以上是关于在将 python2 项目移植到 python3 时,mobileesp 的中间件出现错误的主要内容,如果未能解决你的问题,请参考以下文章

python2 与 python3 语法区别

python2程序移植python3的一些注意事项

pose项目里我遇到的问题

python2 与 python3 语法区别

将 Python 2 程序移植到 Python 3,随机行生成器

python2 与 python3 语法区别