当一个项目能够正常启动,能够正常返回一个页面的时候,那么页面上表单提交如何处理呢?
向后台提交请求,分为get和post
首先来说get
1.需要一个可以提交信息的页面,就用一个之前的页面,templetes下的home.html
这是一个form表单,form表单的action代表了这个submit提交后的参数处理的路由是什么,这里我的路由是/students/stu/login
首先在根目录下找到进入students路由,students路由是包含了stu和stu/login 我们要看我们在students所在的项目url中看,配置的是什么
红色表示当访问127.0.0.1:8000/students/stu的时候回返回login模块中的news
蓝色表示当访问127.0.0.1:8000/students/stu/login的时候会返回login模块中的login_user方法
我们就可以指定form表单提交的action地址是蓝色的地址,这样就会调用方法处理提交的数据
在stu 程序中新增一个py文件,输入以下内容:
# coding=utf-8
from django.http import HttpResponse
from django.shortcuts import render
#登录首页
def news(request):
try:
return render(request,'home.html')
except:#
return HttpResponse('error')
#处理登录
def login_user(request):
username=request.GET.get('username',"")
password=request.GET.get('password',"")
if username=="张三" and password=="123456":
return HttpResponse('登录成功')
return HttpResponse("登录失败!")
其中,username是接受的前端传回的参数,requets.GET.get的意思是,前端form标段采用get方法传入参数,我获取参数的值,“username”是input框的name,必填,后面的是如果没填写,用空值替代
保存后重启服务,访问127.0.0.1:8000/students/stu
会返回home的页面
当在用户名和密码中输入提交后,浏览器的地址就会变为
其中你提交的值变为了url的一部分,只有当html的method和处理程序中的requets方法一致都是get的时候,才能成功执行,不然返回的是失败的内容
再说post
post就是修改页面和响应的请求为post
def login_user(request):
username=request.POST.get('username',"")
password=request.POST.get('password',"")
if username=="张三" and password=="123456":
return HttpResponse('登录成功')
return HttpResponse("登录失败!")
<form action="/students/stu/login/"; method="post">
重启后登录发现,哎,报错403
咋回事?
是因为在程序的setting文件中有这么一个验证
CSRF # 表示django全局发送post请求均需要字符串验证
功能:防止跨站请求伪造的功能
工作原理:客户端访问服务器端,在服务器端正常返回给客户端数据的时候,而外返回给客户端一段字符串,等到客户端下次访问服务器
端时,服务器端会到客户端查找先前返回的字符串,如果找到则继续,找不到就拒绝。
咋办呢?看看下面我添加了什么
<form action="/students/stu/login/"; method="post">
{% csrf_token %}
<p>
<span>用户名:</span>
<input type="text" name="username" />
</p>
<p>
<span>密码:</span>
<input type="password" name="password"/>
</p>
<p>
<input type="submit" value="登录" />
</p>
</form>
</body>
在form表单里面写入一个{% csrf_token %},代表我提交的时候就生成这么一个字符串,后端就会验证字符串啦,也就不会报错了
同样,这是一个很简单的方法,当使用ajax传参数的时候,也需要加上ajax相应的代码
$.ajaxSetup({
data:{csrfmiddlewaretoken:'{{ csrf_token }}'},---------
});
之后再写传参
ok
2.我想返回一个处理函数,处理后再返回值给请求:
在urls中添加:
path('open', user.opendriver),
在user文件中新建一个函数opendriver ,这里我用selenium的driver举例
import time
from selenium import webdriver
def opendriver(request):
return HttpResponse(hh())
def hh():
d = webdriver.Chrome()
d.get("http://101.36.181.117:88/cqnsbg/")
time.sleep(3)
d.close()
return("打开浏览器成功")
新建的函数,返回的是一个hh()的函数,这个函数调用 了浏览器,调用完成后要返回return,一定要返回,不返回东西,opendriver方法调用会报错
这里实验一下,主要是发现了新建的django项目用的默认的虚拟环境venv,要想使用selenium库,需要在当前目录的venv的script中使用pip进行安装,安装后即可使用