微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django REST Framework在文件之间共享类实例

如何解决Django REST Framework在文件之间共享类实例

我的apps.py的ready()方法中有一些代码,该代码使用authlib模块加载一些Oauth提供程序。基本上我是这样做的(apps.py):

from django.apps import AppConfig
from authlib.integrations.django_client import OAuth
from django.core.cache import caches

class ApiConfig(AppConfig):
    name = 'api'

    def ready(self):
        import api.receivers
        defaultcache = caches['default']
        from .modules.oauth import fetch_token
        from .models import OauthProvider,OAuth2Token

        oauth = OAuth(fetch_token=fetch_token)
        print('settings oauthproviders')
        allproviders = OauthProvider.objects.all()
        for provider in allproviders:
            oauth.register(
                name=provider.name,client_id=provider.client_id,client_secret=provider.client_secret_decrypted,access_token_url=provider.access_token_url,access_token_params=provider.access_token_params,authorize_url=provider.authorize_url,authorize_params=provider.authorize_params,api_base_url=provider.api_base_url,client_kwargs=eval(provider.client_kwargs),)

        print(OAuth2Token.objects.get(name='enelogic'))
        defaultcache.set('oauth',oauth)
        #defaultcache.get('oauth') # <--- this line gives error

错误

Fatal Python error: Cannot recover from stack overflow.
Python runtime state: initialized

Thread 0x00001d4c (most recent call first):
  File "c:\program files (x86)\python38-32\lib\threading.py",line 306 in wait
  File "c:\program files (x86)\python38-32\lib\threading.py",line 558 in wait
  File "c:\Users\ericj\.vscode\extensions\ms-python.python-2020.9.112786\pythonFiles\lib\python\debugpy\_vendored\pydevd\pydevd.py",line 230 in _on_run
  File "c:\Users\ericj\.vscode\extensions\ms-python.python-2020.9.112786\pythonFiles\lib\python\debugpy\_vendored\pydevd\_pydevd_bundle\pydevd_daemon_thread.py",line 46 in run
  File "c:\program files (x86)\python38-32\lib\threading.py",line 932 in _bootstrap_inner
  File "c:\program files (x86)\python38-32\lib\threading.py",line 890 in _bootstrap
  File "c:\Users\ericj\.vscode\extensions\ms-python.python-2020.9.112786\pythonFiles\lib\python\debugpy\_vendored\pydevd\_pydev_bundle\pydev_monkey.py",line 823 in __call__

Thread 0x00002b80 (most recent call first):
  File "c:\program files (x86)\python38-32\lib\threading.py",line 184 in _on_run
  File "c:\Users\ericj\.vscode\extensions\ms-python.python-2020.9.112786\pythonFiles\lib\python\debugpy\_vendored\pydevd\_pydevd_bundle\pydevd_daemon_thread.py",line 823 in __call__

Thread 0x0000609c (most recent call first):
  File "c:\program files (x86)\python38-32\lib\threading.py",line 558 in wait
  File "c:\Users\ericj\.vscode\extensions\ms-python.python-2020.9.112786\pythonFiles\lib\python\debugpy\_vendored\pydevd\_pydevd_bundle\pydevd_timeout.py",line 43 in _on_run
  File "c:\Users\ericj\.vscode\extensions\ms-python.python-2020.9.112786\pythonFiles\lib\python\debugpy\_vendored\pydevd\_pydevd_bundle\pydevd_daemon_thread.py",line 890 in _bootstrap

Thread 0x00000ad4 (most recent call first):
  File "c:\Users\ericj\.vscode\extensions\ms-python.python-2020.9.112786\pythonFiles\lib\python\debugpy\_vendored\pydevd\_pydevd_bundle\pydevd_comm.py",line 209 in _read_line
  File "c:\Users\ericj\.vscode\extensions\ms-python.python-2020.9.112786\pythonFiles\lib\python\debugpy\_vendored\pydevd\_pydevd_bundle\pydevd_comm.py",line 227 in _on_run
  File "c:\Users\ericj\.vscode\extensions\ms-python.python-2020.9.112786\pythonFiles\lib\python\debugpy\_vendored\pydevd\_pydevd_bundle\pydevd_daemon_thread.py",line 890 in _bootstrap

Thread 0x00005cf8 (most recent call first):
  File "c:\Users\ericj\.vscode\extensions\ms-python.python-2020.9.112786\pythonFiles\lib\python\debugpy\_vendored\pydevd\_pydevd_bundle\pydevd_net_command.py",line 111 in send
  File "c:\Users\ericj\.vscode\extensions\ms-python.python-2020.9.112786\pythonFiles\lib\python\debugpy\_vendored\pydevd\_pydevd_bundle\pydevd_comm.py",line 370 in _on_run
  File "c:\Users\ericj\.vscode\extensions\ms-python.python-2020.9.112786\pythonFiles\lib\python\debugpy\_vendored\pydevd\_pydevd_bundle\pydevd_daemon_thread.py",line 890 in _bootstrap

Current thread 0x00005924 (most recent call first):
  File "c:\program files (x86)\python38-32\lib\traceback.py",line 476 in __init__
  File "c:\program files (x86)\python38-32\lib\traceback.py",line 493 in __init__
  File "c:\program files (x86)\python38-32\lib\traceback.py",line 103 in print_exception
  File "c:\program files (x86)\python38-32\lib\traceback.py",line 163 in print_exc
  File "c:\Users\ericj\.vscode\extensions\ms-python.python-2020.9.112786\pythonFiles\lib\python\debugpy\_vendored\pydevd\_pydev_bundle\pydev_log.py",line 130 in _pydevd_log_exception
  File "c:\Users\ericj\.vscode\extensions\ms-python.python-2020.9.112786\pythonFiles\lib\python\debugpy\_vendored\pydevd\_pydev_bundle\pydev_log.py",line 160 in exception
  File "c:\Users\ericj\.vscode\extensions\ms-python.python-2020.9.112786\pythonFiles\lib\python\debugpy\_vendored\pydevd\_pydevd_bundle\pydevd_trace_dispatch_regular.py",line 462 in __call__
  File "C:\Users\ericj\.virtualenvs\django_appelent_api-8qkCZVAS\lib\site-packages\authlib\integrations\base_client\base_oauth.py",line 101 in __getattr__
  File "C:\Users\ericj\.virtualenvs\django_appelent_api-8qkCZVAS\lib\site-packages\authlib\integrations\base_client\base_oauth.py",line 105 in __getattr__
  File "C:\Users\ericj\.virtualenvs\django_appelent_api-8qkCZVAS\lib\site-packages\authlib\integrations\base_client\base_oauth.py",line 105 in __getattr__

这会注册一些可以使用oauth变量使用的oauth凭据(信息)(例如oauth.get_authorization_url(),该变量会向我获取该Oauth提供商的授权URL。

现在,我有很多不同的文件(我将views.py拆分为多个文件)。如何在那些文件中访问此oauth变量?我已经尝试过使用django缓存,但是当我尝试访问该变量时,我收到一个奇怪的溢出错误

您如何推荐?

oauth类在文件中本地正常运行,我只需要将其传输到其他文件

解决方法

为什么不将其提取到单独的python文件中(但仍在django应用程序内部)。

# oauth_providers.py

from authlib.integrations.django_client import OAuth

from .modules.oauth import fetch_token
from .models import OauthProvider,OAuth2Token


def register_providers(oauth):
    print('settings oauthproviders')
    allproviders = OauthProvider.objects.all()
    for provider in allproviders:
        oauth.register(
            name=provider.name,client_id=provider.client_id,client_secret=provider.client_secret_decrypted,access_token_url=provider.access_token_url,access_token_params=provider.access_token_params,authorize_url=provider.authorize_url,authorize_params=provider.authorize_params,api_base_url=provider.api_base_url,client_kwargs=eval(provider.client_kwargs),)

    print(OAuth2Token.objects.get(name='enelogic'))

oauth = OAuth(fetch_token=fetch_token)
# apps.py
from django.apps import AppConfig


class ApiConfig(AppConfig):
    name = 'api'

    def ready(self):
        from .oauth_providers import oauth,register_providers
        register_providers(oauth)

现在您可以通过简单的导入在视图中使用

# views.py

from .oauth_providers import oauth

# do whatever with oauth

是的,有一些警告是它将成为一个全局变量(因此,请不要尝试更改,我认为您不需要这样做),也不要尝试将文件导入您的{{1} },因为它应该在应用models.py之后导入。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?