【问题标题】:Does using static variables in django views a good practise?在 django 视图中使用静态变量是一种好的做法吗?
【发布时间】:2021-01-20 00:00:15
【问题描述】:

假设 get 方法在 post 方法之前至少被调用一次。(这不是我的实际代码,如果有任何愚蠢的错误,不要考虑它,我的问题是我可以实例化并使用下面的静态变量吗)

class McqView(View):
      course=None
      all_questions=None
      start_time=None
      def get(self,request,someid):
             if not McqView.course:
                 McqView.course = Course.objects.get(id=someid)
             if not McqView.all_questions:
                 McqView.all_questions = Question.objects.filter(course=McqExamView.course)
             if not McqView.start_time:
                 McqView.start_time = datetime.now()
             #using the static variables somewhere here

      def post(self,request):
              #using the same static variables somewhere here

我想过使用这两个作为成员变量,但这是不可能的。所以我想到了将两者用作静态变量。使用这种方法会不会出现问题?喜欢 1.静态变量变为None 2.静态变量不止一次被实例化。 如果发生第二种情况,start_time变量的值就会出错。

请告诉我这是否是错误的方法,如果是错误的,请告诉我另一种方法。

【问题讨论】:

    标签: python django django-views static-variables


    【解决方案1】:

    虽然基于类的最小视图不需要任何类属性来执行其工作,但类属性在许多基于类的设计中很有用,并且有两种方法可以配置或设置类属性。

    第一种是标准的 Python 子类化和覆盖子类中的属性和方法的方式。因此,如果您的父类具有这样的属性greeting

    from django.http import HttpResponse
    from django.views import View
    
        class GreetingView(View):
            greeting = "Good Day"
        
            def get(self, request):
                return HttpResponse(self.greeting)
    

    您可以在子类中覆盖它:

    class MorningGreetingView(GreetingView):
        greeting = "Morning to ya"
    

    另一种选择是将类属性配置为 URLconf 中 as_view() 调用的关键字参数:

    urlpatterns = [
        path('about/', GreetingView.as_view(greeting="G'day")),
    ]
    

    注意 - 虽然您的类会针对分派给它的每个请求进行实例化,但通过 as_view() 入口点设置的类属性仅在您的 URL 被导入时配置一次。

    【讨论】:

    • 提到了 Django Docs 中提到的避免类属性的 2 种方法
    猜你喜欢
    • 2011-06-01
    • 2011-08-13
    • 2013-05-23
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多