首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使Django 2.2中的中间件对象可调用

如何使Django 2.2中的中间件对象可调用
EN

Stack Overflow用户
提问于 2021-12-31 12:27:13
回答 1查看 179关注 0票数 1

我正在尝试将django/夹层应用程序从python2.7更新到python3.7。你能帮我修复下面的错误(CTypeError: 'CheckNewsDateStatus' object is not callable)吗?

似乎根本不使用这个类;如果我通过所有代码进行grep,那么只匹配附加的settings.py和middleware.py。它是在django/夹层中部分实现的,还是为了将整个类删除为不必要的?

我不知道代码是如何工作的,我也不知道这个特性是否已经被使用过.我不知道如何在setings.py-file中显示可调用的对象。

代码语言:javascript
复制
(python-3.7) miettinj@ramen:~/pika-py-3.7/pika> python manage.py runserver 0:8034
BASE_DIR /srv/work/miettinj/pika-py-3.7/pika
PROJECT_ROOT /srv/work/miettinj/pika-py-3.7/pika/pika
/srv/work/miettinj/python-3.7/lib/python3.7/site-packages/mezzanine/utils/timezone.py:13: PytzUsageWarning: The zone attribute is specific to pytz's interface; please migrate to a new time zone provider. 
/srv/work/miettinj/python-3.7/lib/python3.7/site-packages/mezzanine/utils/conf.py:67: UserWarning: TIME_ZONE setting is not set, using closest match: Europe/Helsinki
  warn("TIME_ZONE setting is not set, using closest match: %s" % tz)
BASE_DIR /srv/work/miettinj/pika-py-3.7/pika
PROJECT_ROOT /srv/work/miettinj/pika-py-3.7/pika/pika
/srv/work/miettinj/python-3.7/lib/python3.7/site-packages/mezzanine/utils/timezone.py:13: PytzUsageWarning: The zone attribute is specific to pytz's interface; please migrate to a new time zone provider. 
/srv/work/miettinj/python-3.7/lib/python3.7/site-packages/mezzanine/utils/conf.py:67: UserWarning: TIME_ZONE setting is not set, using closest match: Europe/Helsinki
  warn("TIME_ZONE setting is not set, using closest match: %s" % tz)
Watching for file changes with StatReloader
              .....
          _d^^^^^^^^^b_
       .d''           ``b.
     .p'                `q.
    .d'                   `b.
   .d'                     `b.   * Mezzanine 5.0.0
   ::                       ::   * Django 2.2
  ::    M E Z Z A N I N E    ::  * Python 3.7.10
   ::                       ::   * PostgreSQL 9.3.0
   `p.                     .q'   * Linux 5.3.18-lp152.102-default
    `p.                   .q'
     `b.                 .d'
       `q..          ..p'
          ^q........p^
              ''''

Performing system checks...

System check identified no issues (0 silenced).
December 31, 2021 - 14:08:56
Django version 2.2, using settings 'pika.settings'
Starting development server at http://0:8034/
Quit the server with CONTROL-C.
/srv/work/miettinj/python-3.7/lib/python3.7/site-packages/django/core/handlers/base.py:37: 
/srv/work/miettinj/python-3.7/lib/python3.7/site-packages/django/core/handlers/base.py:37: FutureWarning: `TemplateForDeviceMiddleware` is deprecated. Please remove it from your middleware settings.
  mw_instance = middleware(handler)
Internal Server Error: /admin/
Traceback (most recent call last):
  File "/srv/work/miettinj/python-3.7/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
TypeError: 'CheckNewsDateStatus' object is not callable

middlewary.py:

代码语言:javascript
复制
class CheckNewsDateStatus:
    def __init__(self, get_response):
        self.get_response = get_response 

    def process_request(self, request):
        if '/uutinen/' in request.path:
            try:
                path_to_go_raw = request.path
                true_slug = path_to_go_raw.split('/uutinen/')[1:]
                news_obj = Uutinen.objects.get(slug=true_slug[0])
                now_utc = pytz.utc.localize(datetime.now())
                
                hel = pytz.timezone("Europe/Helsinki")
                foo = news_obj.publish_date.astimezone(hel)
                
                if foo.date() < now_utc.date() and news_obj.status == 2:
                    pass
                elif foo.date() == now_utc.date() and foo.time() < now_utc.time()  and news_obj.status == 2:
                    pass
                else:
                    print("authenticated-->", request.user.is_authenticated())
                    if request.user.is_authenticated():
                        pass
                    elif news_obj.status == 1:
                        return HttpResponseNotFound('404')
                    else:
                        return HttpResponseNotFound('404')
            except:
                pass

settings.py:

代码语言:javascript
复制
    # List of middleware classes to use. Order is important; in the request phase,
    # these middleware classes will be applied in the order given, and in the
    # response phase the middleware will be applied in reverse order.
    MIDDLEWARE = (
        'page_types.middleware.CheckNewsDateStatus', 
        'page_types.middleware.SetDynamicSite',
    #    'debug_toolbar.middleware.DebugToolbarMiddleware',
        "mezzanine.core.middleware.UpdateCacheMiddleware",
        "django.contrib.sessions.middleware.SessionMiddleware",
        #"django.middleware.locale.LocaleMiddleware",
        "statfi_search.middleware.locale.LocaleMiddleware",
        "django.contrib.auth.middleware.AuthenticationMiddleware",
        "django.middleware.common.CommonMiddleware",
        "django.middleware.csrf.CsrfViewMiddleware",
        "django.contrib.messages.middleware.MessageMiddleware",
        "mezzanine.core.request.CurrentRequestMiddleware",
        "mezzanine.core.middleware.RedirectFallbackMiddleware",
        "mezzanine.core.middleware.TemplateForDeviceMiddleware",
        "mezzanine.core.middleware.TemplateForHostMiddleware",
        "mezzanine.core.middleware.AdminLoginInterfaceSelectorMiddleware",
        "mezzanine.core.middleware.SitePermissionMiddleware",
        # Uncomment the following if using any of the SSL settings:
        # "mezzanine.core.middleware.SSLRedirectMiddleware",
        "mezzanine.pages.middleware.PageMiddleware",
        "mezzanine.core.middleware.FetchFromCacheMiddleware",
        'page_types.middleware.RedirectMiddleware',
    )
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-31 12:52:16

这里有一个旧的混合风格,您需要从MiddlewareMixin继承

更改代码,以便CheckNewsDateStatus对象从MiddlewareMixin继承如下

代码语言:javascript
复制
# this will probably be in page_types/middleware.py file 
class CheckNewsDateStatus(MiddlewareMixin):
    def __init__(self, get_response):
        self.get_response = get_response 

    def process_request(self, request):
        if '/uutinen/' in request.path:
            # rest of code
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70542344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档