【发布时间】: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中没有encrypt、decrypt、conversion,然后在没有select_option、conv_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})
标签: python django django-templates conditional-statements jinja2