django管理命令和用户

django管理命令和用户,django,authentication,command-line,django-views,Django,Authentication,Command Line,Django Views,我经常使用django自定义管理/命令。我想通过这些脚本提供对我的视图的访问;但是,对于如何为经过身份验证的用户执行此操作,我感到困惑。我并没有真正使用中间件库,所以我只需要访问请求;有没有建议我为什么可以伪造这个?例如 def poll_view( request ): user = None if 'META' in request and 'REMOTE_USER' in request.META: user = request.META['REMOTE_USER']

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

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 )

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

视图.py

from managment import Command

def some_view(request):
    Command._private_function(request=request)
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()
命令.py

from managment import Command

def some_view(request):
    Command._private_function(request=request)
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()

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

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

例如:

-----------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()

隐马尔可夫模型。。。有趣。因此,我希望将我的主要逻辑放在views.py而不是commands.py中(这有点奇怪,因为我使用commands.py作为访问方法,而不是按照django手册进行维护)。在这种情况下,你的解决方案是否违背了干燥原则?干杯:)是的,我认为在django命令中加入任何逻辑都不是一个好主意。您将多久使用一次该命令?它们实际上应该只用于管理/后端操作,而不是真正针对前端用户