关于get和post请求
最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。
随便的一个页面我们调出控制台,来到network就能发现我们访问这个web的时候触发了许多的get或者post方法,准确来说:
get请求:从服务器获取数据,对服务器没有影响,传参放在url中。
post请求:对服务器产生一定的影响,用post请求,比如生成session等。
get请求
在早期的网络中,如果需要通过请求来查找网站数据库中的某个符合条件的数据,一把情况下都是通过网站url中加上?后面表示查询语句来构成的,所以如果我们对?后面的语句不进行过滤的话就衍生出了sql注入的原理,好了回到我们的正题:flask中的GET请求如果做到。
那一个查找页面来说,如果需要查询一个文章或者某个句子,就需要我们向服务器发送一个GET请求,请求服务器中的某些数据。
来个简单的例子,这个按钮给一个url反转,来提交一个查询的GET请求。
html代码:
<ul>
<li><a href="{{ url_for('hello_world') }}">首页</a></li>
<li><a href="{{ url_for('demo') }}">登陆页面</a></li>
<li><a href="{{ url_for('search',q='abc') }}">插找</a></li>
</ul>
flask代码:
@app.route('/search/')
def search():
name = request.args.get('q')
return 'name %s' % name
访问之后就会显示出 name abc,如果我们将q后面的内容改变,就会返回对应改变的内容,request库中的args的get方法就是get到q中的内容,便于下一步到数据库中查找数据返回到前端页面。
POST请求
post请求常用于一个网站的登陆操作,我们来新建一个登陆页面。
很简单的一个登陆页面,下面上前端和后台的代码,前端用的是模板继承,在前面的博客讲过就不在说了。
html代码:
{% extends 'base.html' %}
{% block title %}
这是登陆页面
{% endblock %}
{% block main %}
<div style="width: 100%;">
<form action="{{url_for('demo')}}" method="post">
<p style="margin-left: 45%;width: 10%">user:<input type="text" name="username"></p>
<p style="margin-left: 45%;width: 10%">pawd:<input type="password" name="password"></p>
<input type="submit" style="margin-left: 45%;width: 10%" value="login">
</form>
</div>
{% endblock %}
flask代码:
@app.route('/demo/',methods=['GET','POST'])
def demo():
if request.method == 'GET': # 如果是get请求,就返回当前的登陆页面
return render_template('demo.html')
else: # post请求
username = request.form.get('username')
username = request.form.get('password')
return username
解析一下这段代码,在第一行声明了这个页面的两个方法,函数中如果是首次来到这个页面就是get方法,get到页面的登陆页面,如果提交username和password就是post方法。
G对象
一般的,一整套的网站我们需要一个登陆日志来记录当前网站的访问的用户的信息,包括用户的IP、用户名、密码……所以产生了另一个python文件utils.py我们从主app中调用这个文件中的login函数来打印出来登陆的用户。
def login_log(username):
print('当前登陆的用户是:',username)
这样在主app的py文件中,每次调用都需要传递一个用户名,这样如果我们的方法很多,就会很麻烦,这样就诞生了G对象,import里面加入g,在另外一个日志文件里面导入 from flask import g
@app.route('/demo/',methods=['GET','POST'])
def demo():
if request.method == 'GET': # 如果是get请求,就返回当前的登陆页面
return render_template('demo.html')
else: # post请求
username = request.form.get('username')
password = request.form.get('password')
if username == 'admin' and password == 'admin':
g.username = 'admin'
login_log()
return 'login succese'
else:
return render_template('demo.html')
注意g对象的使用,这个在主app文件中,在utils中如下:
from flask import g
def login_log():
print('当前登陆的用户是:',g.username)
g是一个全局的,在主app文件中声明的g.username 在这个文件中也可以进行调用,这样就很方便,不用再一边一边的去传递参数了。
钩子函数
先理解一下钩子函数,就是在程序流程图中,本来程序是顺序执行的,但是如果有一个钩子函数的话,这个函数就可以插入到任何流程中间,本来是AB结果变成ACB这就是钩子函数,主要有两个一个是 before_request
@app.before_request
def my_before_request():
print('my_before_request')
在主app文件中有一个before_requese函数之后,每次访问一个页面,都会先执行这个print操作。在判断用户是否有这个网站的session方面配合g对象是一个很好的使用方法。
第二个钩子函数context_processor上下文函数,如果我们在一个网站中,已经登陆了,有时候会有导航条,那么这个导航条中的登陆按钮就需要变成用户的昵称,这就需要一个模板传参,但是我们不能在每个render_template都传递一个参数吧,这样就很大的重复工作,那么context_processor就能用到
@app.context_processor
def my_context_processor():
return {'username':'username'}
就会直接把参数传递到模板中,不需要一个一个传递。
flask全部就到这了,ending…