今天使用了Python的WEB框架Django进行学习,围绕学习“表单”做了一些程序,于是就有了这份实验报告:
期间我遇到了一些问题,例如:MultiValueDictKeyError at /add/ “‘a’” 这样的错误,并最终弄懂了它是如何运行并解决这个问题。
我是从"自强学堂"上找了一些小案例——加减乘除,跟着源码一步一步写然后完成了效果。于是自己重新创建了一个项目开始练习我学习到的知识:
通过request.GET这样的方法获取我前端页面上提交过来的"a"&"b"两个值
(通过form表单,get提交方式)
[views.py]: #这是它的设计思想
a = int(request.GET['a']) #我把他们变成int类型
b = int(request.GET['b'])
return HttpResponse(str(a+b)) #这个HttpResponse大家都会用,只接受str参数
HttpResponse是直接将字符串渲染到当前页面,会盖住页面原有的内容。
其实总的来看这非常简单:但是这只是一个开始——在实验步骤上我不太想贴太多代码,免得大家看的繁复,我只提供设计思想。所以接下来我还是得有必要补充一下前端的内容。
我只写了一个前端页面,用于提交表单到后台,但是它的提交地址指向了另一个URL:^add$,所以我写了第二个视图函数——许多关键问题就出现在这里!
[views.py]:
def add(request):
if request.method == 'GET':
a = int(request.GET['a'])
b = int(request.GET['b'])
return HrrpResponse(str(a+b))
return HttpResponse("Here not a world.")
这并没有什么特别的,只是多了一个步骤:if request.method == 'GET’罢了。
我在想,我通过提交表单的值,跳转到相应URL,执行相关参数的时候,他可以正常显示。那我如果直接输入他的URL——而不传递任何的值呢?
[url:127.0.0.1/add/]:
MultiValueDictKeyError at /add/
"'a'"
Request Method: GET
Request URL: http://127.0.0.1:8000/add/
...调试界面的错误云云
无非就是系统找不到a = request.GET['a‘] 这一步的值"a"而已,所以无法顺序执行。
你猜怎么着?我写了个异常处理。
[views.py]:
if request.method == 'GET':
try:
a = int(request.GET['a'])
b = int(request.GET['b'])
return HttpResponse(str(a+b))
except:
return HttpResponse('没有值')
return HttpResponse('Here not a world.')
页面上赤裸裸地挂着三个字:没有值。说明了什么?
通过这些尝试我发现我真正进一步领会了页面常用的 “POST"与"GET” 两种请求方法:那就是只要你点开一个页面(可以说是输入一个URL并且按下回车),他默认的请求方法就是GET,不论你是否提交数据。对于它来说,只要你不指定其他的提交方法,if request == ‘GET’ 就始终等于True.
而这就是为什么其实很简单的一个东西我却想了半天,因为if request == 'POST’不总是等于True这样的思想影响到了我,使我觉得,只要我不写(提交方法)他就不会执行。