【问题标题】:django management commands and userdjango管理命令和用户
【发布时间】:2011-06-10 01:33:47
【问题描述】:

我经常使用 django 自定义管理/命令。我想通过其中一些脚本提供对我的视图的访问;但是,我对如何为经过身份验证的用户执行此操作感到困惑。我并没有真正使用中间件库,所以我只需要访问 request.META['REMOTE_USER'];有推荐的为什么我可以伪造这个吗?例如,

def poll_view( request ):
  user = None
  if 'META' in request and 'REMOTE_USER' in request.META:
    user = request.META['REMOTE_USER']
  if not user == None:
    do_something()

在我的管理/命令脚本中,我有:

class Command(BaseCommand):
  def handle(self, *args, **kwargs):
    req = ???
    poll_view( req )

【问题讨论】:

    标签: django authentication command-line django-views


    【解决方案1】:

    也许您可以重构视图以仅提取您需要的功能并将其放入帮助模块中。这样,您可以在视图和管理命令中调用此函数。

    例子:

    -----------in a file named somewhere.py----------
    def do_this():
        #do these
        pass
    
    ------------in your view-------------------------
    from somewhere import do_this
    
    def my_view(request):
      user = request.META.get('REMOTE_USER', None)
      if user:
          do_this()
    
    
    -----------in your management command----------
    from somewhere import do_this
    
    class my_command(...):
    
        def handle(self, args*, kwargs**):
            do_this()
    

    【讨论】:

      【解决方案2】:

      管理命令只是函数,所以不要从命令中调用视图,而是从视图中调用命令并将请求作为参数传递

      views.py

      from managment import Command
      
      def some_view(request):
          Command._private_function(request=request)
      

      commands.py

      class Command(...):
      
          def _private_function(request=None):
              if request:
                  // do action with request details (i.e. coming from a view)
              else:
                  // do action without (i.e. coming from command line)
      
          def handle(self,...):
              _private_function()
      

      这允许您从命令行或视图(即网络)执行管理命令的主要逻辑。不过,您需要小心并确保您确实希望有权访问视图的人(经过身份验证的用户)执行任何操作

      【讨论】:

      • 嗯...有趣。所以我本来希望我想把我的主要逻辑放在views.py而不是commands.py中(这有点奇怪,因为我使用commands.py作为访问方法而不是根据django手册进行维护)。在这种情况下,您的解决方案是否违反 DRY 原则?干杯:)
      • 是的,我认为将任何类型的逻辑放入 django 命令中并不是一个好主意。您将多久使用一次该命令?它们应该只真正用于管理/后端操作,而不是真正针对前端用户
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 2012-06-29
      • 2012-05-01
      • 1970-01-01
      • 2021-01-24
      • 2013-06-05
      • 1970-01-01
      相关资源
      最近更新 更多