在 Jinja 模板中使用条件逻辑处理用户选择(凯撒密码 Django Web 应用程序)

Posted

技术标签:

【中文标题】在 Jinja 模板中使用条件逻辑处理用户选择(凯撒密码 Django Web 应用程序)【英文标题】:Handling user choice with conditional logic in Jinja template (caesar cipher Django web app) 【发布时间】:2021-05-02 15:36:06 【问题描述】:

我正在编写一个 Django 网络应用程序,它基本上为网络访问者提供了使用非常基本的凯撒密码加密/解密消息的选项。我得到了加密功能,但是当我尝试在我的模板中实现条件逻辑来处理用户在登录页面上的初始选择(加密或解密的选项)时,Django 没有为客户端提供选项。我不知道为什么。

我希望 Django 在登录页面上给网络访问者这样的选择:

您想加密纯文本消息吗?或者你想解密一个加扰的消息?

(...每个问题都是一个超链接,将访问者带到一个页面以输入他们的信息)。

当网络访问者登陆页面时,两个选项都不会显示。 Django 只是提供一个空白模板。

这是我的开发服务器的临时镜像:https://d0d342ea4934.ngrok.io

这是我的views.py:

from django.shortcuts import render
import string

def caesar(request):
    # Courtesy of Real Python: https://realpython.com/python-practice-problems/
    if 'encrypt' in request.GET:
        plain_text = request.GET['original_entry']
        shift_num = request.GET['shift_num']
        shift_num = int(shift_num)
        letters = string.ascii_lowercase
        mask = letters[shift_num:] + letters[:shift_num]
        trantab = str.maketrans(letters, mask)
        output_text = plain_text.translate(trantab)
        context = 'select_option': False, 'output_text': output_text, 'original_entry': plain_text, 'conv_decrypt': False, 'conv_encrypt': True
        return render(request, 'landings/home.html', context)
    
    elif 'decrypt' in request.GET:
        plain_text = request.GET['original_entry']
        shift_num = request.GET['shift_num']
        shift_num = -int(shift_num)
        letters = string.ascii_lowercase
        mask = letters[shift_num:] + letters[:shift_num]
        trantab = str.maketrans(letters, mask)
        output_text = plain_text.translate(trantab)
        context = 'select_option': False, 'output_text': output_text, 'original_entry': plain_text, 'conv_decrypt': True, 'conv_encrypt': False
        return render(request, 'landings/home.html', context)
    
    elif 'conversion' in request.GET:
        conversion = request.GET['conversion']
        if conversion == 'encrypt':
            context = 'select_option': False, 'result_encrypt': True, 'result_decrypt': False, 'conv_decrypt': True, 'conv_encrypt': False, 'conv_decrypt': False, 'conv_encrypt': True
            return render(request, 'landings/home.html', context)
        elif conversion == 'decrypt':
            context = 'select_option': False, 'result_encrypt': False, 'result_decrypt': True
            return render(request, 'landings/home.html', context)
    
    return render(request, 'landings/home.html')

这是我正在使用的模板 (home.html):

% block content %   

   <br>
   <center>
  
   <h1>Hello, World!</h1>
   % if select_option %
   <h3>Would you like to <a href="% url 'caesar' %?conversion=encrypt">encrypt</a> a plaintext message?</h3>

   <h3>Or would you like <a href="% url 'caesar' %?conversion=decrypt">to decrypt</a> a scrambled message?</h3>
   % elif conv_encrypt %
   <form action="% url 'caesar' %" >
       Enter the text you wish to scramble here:
       <br>
       <input type="text" name="original_entry" />
       <br />
       Enter your key:
       <br>
       <input type="number" name="shift_num" />
       <br />
       <input type="submit" value="Encrypt!" />
     </form>
   </form>
   % elif conv_decrypt %
   <form action="% url 'caesar' %" >
       Enter the text you wish to scramble here:
       <br>
       <input type="text" name="original_entry" />
       <br />
       Enter your key:
       <br>
       <input type="number" name="shift_num" />
       <br />
       <input type="submit" value="Decrypt!" />
     </form>
   % elif result_encrypt %
  
   <h3>Here is your message encrypted:</h3>

   <div class="field">  output_text  </div>

   <br>
   <a href="% url 'caesar' %"><div class="field"> <strong> Again? Click here! </strong> </div> </a>

 % elif result_decrypt %
   <h3>Here is your message decrypted:</h3>
  
   <div class="field">  output_text  </div>
 
   <br>
   <a href="% url 'caesar' %"><div class="field"> <strong> Again? Click here! </strong> </div> </a>

 % endif %

这是我完整的 GitHub 存储库中的 the full source code,其中引用了我当前的工作分支。

到目前为止我所尝试的:

我尝试在 views.py 中交换不同的真值。例如,我尝试将键值对 'select_option': False, 从 False 切换为 True。我在views.py的四个不同位置尝试了不同的组合。` 我的密码算法基于 Real Python 上的 Jim Anderson’s practice problem。 没有可供我使用的追溯,因此我没有任何搜索字词可在 Google 上查找。

我的本​​地开发环境在 Linux 系统上运行 Python 3.9.1。这是$ pip freeze的输出:

asgiref==3.3.1 
Django==3.1.5 
Pillow==8.1.0 
pytz==2020.5
sqlparse==0.4.1 
whitenoise==5.2.0

我将这个凯撒密码网络应用程序基于一个名为CC_Redact 的单独 Django 项目的先前网络应用程序,该项目成功地为网络访​​问者提供了将英里转换为公里或公里转换为英里的选择(template,@987654328 @)。它的功能和行为符合预期。我正在尝试模仿该功能。

【问题讨论】:

首先检查print( request.GET ) - 也许你在request.GET 中没有encryptdecryptconversion,然后在没有select_optionconv_encrypt 的情况下执行return render(request, 'landings/home.html') , conv_decrypt 你会得到空白页。至于我,你有太多if/elif,但你没有else,当你没有其他变量时,它可能会显示一些东西。 对我来说,你所有的问题是你必须运行带有参数的 url 才能看到任何东西 - 即。 d0d342ea4934.ngrok.io/?conversion=encrypt - 如果你在没有任何参数的情况下运行,那么你什么也看不到。当没有选项时,您没有显示任何内容的代码。它可以显示带有参数的页面链接,即。 d0d342ea4934.ngrok.io/?conversion=encrypt d0d342ea4934.ngrok.io/?conversion=decrypt 或者你应该使用选项 'select_option': True 在最后 return - return render(request, 'landings/home.html', 'select_option': True) 【参考方案1】:

对我来说,你所有的问题是你必须使用参数运行 url 才能看到任何东西

d0d342ea4934.ngrok.io/?conversion=encrypt 
d0d342ea4934.ngrok.io/?conversion=decrypt

d0d342ea4934.ngrok.io/?encrypt&original_entry=...&shift_num=...
d0d342ea4934.ngrok.io/?decrypt&original_entry=...&shift_num=...

当你不带参数运行它时

d0d342ea4934.ngrok.io

然后它最后运行return

return render(request, 'landings/home.html')

没有上下文 'select_option': True, ... 所以你的 template 什么都不显示。

在最后一个return 你应该至少有

return render(request, 'landings/home.html', 'select_option': True)

显示

Would you like to encrypt a plaintext message? 
Or would you like to decrypt a scrambled message?

【讨论】:

尤里卡!谢谢你,弗拉斯!是的,在最后的返回操作(最后一行)中添加'select_option': True 会显示“您要加密纯文本消息吗?还是要解密加扰的消息?”。其他一些 Truthy 值仍然需要调整,但你已经解决了我的主要问题。谢谢! :)

以上是关于在 Jinja 模板中使用条件逻辑处理用户选择(凯撒密码 Django Web 应用程序)的主要内容,如果未能解决你的问题,请参考以下文章

Jinja2模板引擎简介

jinja模板语言

Flask 入门教程:Jinja2模板用法

Flask 入门教程:Jinja2模板用法

为啥我的条件逻辑在 Jinja2/CherryPy 中没有按预期工作?

flask的模板