面向未来的可读性应用程序代码(Django,初学者)

时间:2018-01-04 04:43:45

标签: python django performance modularity

我的网站的目标是有一个页面,让我们称之为随机问题!"

每次用户进入页面时,都会随机生成一组数字,他们必须正确回答问题:numbera + number b。

如果他们是正确的,他们会转到一个页面,上面写着"正确"然后,他们再次使用不同的数字重定向回同一页面。

现在,问题是,在第一页"随机问题!",我想向它添加另一个问题。

Views.py:

def form_handle(request):
    if request.method == 'POST':
        form = MyForm(request.POST) # if post method then form will be validated
        if form.is_valid():
            cd = form.cleaned_data
            num1 = cd.get('num1')
            a = request.session.get('a', 0)
            b = request.session.get('b', 0)
            if float(num1) == float(a + b):
                # give HttpResponse only or render page you need to load on success
                return render(request, 'sectipn1part1success', {})
            else:
                # if sum not equal... then redirect to custom url/page
                return HttpResponseRedirect('rr/')  # mention redirect url in argument

    else:
        a = random.randrange(5,10);
        b = random.randrange(10,20);
        request.session['a'] = a
        request.session['b'] = b
        question1 = ('What is ' + str(a) + ' + '  + str(b) + ' ?')
        form = MyForm() # blank form object just to pass context if not post method
        context = {
        'form': form,
        'a': a,
        'b': b,
        'question1': question1
        }
    return render(request, "section1part1.html", context)

正如你所看到的,现在它只做一个简单的问题风格,只是加法(问题1)。

我想添加另一个问题,例如问题2,这可能类似于"什么是/ 2"

使用类似Java SWITCH语句的东西可以实现上述类似的东西(我不确定Django是否拥有它,尽管如果没有它可以做到这一点)。将生成对应于另一个问题的随机数。如果request.method ==' POST'那么我必须使用另一个IF语句。计算正确的答案,因为每个新问题的计算方式都不同。

现在,短期内上述将是一个很好的策略。

从长远来看,我不确定它是否理想。有没有更好的办法做这种事情还是我的方式好吗?

我在考虑其他方式,包括:

  • 使用视图调度程序排序的函数,例如,它会调用另一个视图而不是一个视图上的所有视图,但我不确定这是否可能

**我应该注意哪些性能方面的考虑因素? **

更新#1

好的,我已经完成了上面提到的建议。这就是:

Django视图被调用 - >随机调用另一个视图函数并执行处理并返回上下文对象

else: #add another 'if' randomiser to selection question function randomly
    context = question1(request) 
    context = question2(request)
return render(request, "section1part1.html", context)

这是一个好习惯/风格吗?我应该继续这样做吗?

1 个答案:

答案 0 :(得分:0)

NameError: name 'A' is not defined 应该只负责处理表格。所有创造问题和答案的工作都应该通过其他方式完成。一旦你这样做,很容易切换问题类型,或产生无限循环的问题,或创建一个循环的问题列表,或...

以下是form_handle类的示例。您可以轻松创建返回Question元组或任何其他各种问题/答案生成器的函数。

(question, answer)

然后,您的代码仅依赖于具有class Question(object): def answer(self): raise NotImplementedError def question(self): raise NotImplementedError class AdditionQuestion(Question): def __init__(self): a_range = (5, 10) b_range = (10, 20) self.a = random.randrange(*a_range) self.b = random.randrange(*b_range) def answer(self): return self.a + self.b def question(self): return 'What is {} + {}?'.format(self.a, self.b) class MultiplicationQuestion(Question): def __init__(self): a_range = (100, 200) b_range = (10, 20) self.a = random.randrange(*a_range) self.b = random.randrange(*b_range) def answer(self): return self.a * self.b def question(self): return 'What is {} * {}?'.format(self.a, self.b) object.question()的对象。如果您需要非数字答案或足够接近的答案(例如:3.3333足够接近3.333333),您可以将object.answer()更改为if float(num1) == float(answer):,然后编写if compare_answers(num1, answer):函数。

compare_answers

如果你想要一个随机的问题类型生成器,也可以使它成为自己的函数/对象。将其与def form_handle(request): if request.method == 'POST': form = MyForm(request.POST) # if post method then form will be validated if form.is_valid(): cd = form.cleaned_data num1 = cd.get('num1') answer = request.session.get('answer', 0) if float(num1) == float(answer): # give HttpResponse only or render page you need to load on success return render(request, 'sectipn1part1success', {}) else: # if sum not equal... then redirect to custom url/page return HttpResponseRedirect('rr/') # mention redirect url in argument else: question = AdditionQuestion() answer = question.answer() request.session['answer'] = answer form = MyForm() # blank form object just to pass context if not post method context = { 'form': form, 'answer': answer, 'question': question.question() } return render(request, "section1part1.html", context) 分开,以便更改:

form_handle

然后在这里更改以下行:

def random_question():
    class_ = random.choice([MultiplicationQuestion, AdditionQuestion])
    return class_()

为:

else:
    question = AdditionQuestion()