1.模板继承
当我们很多模板都包含同一个内容时,我们可以将相同的内容提出来做成一个模板,再让其他模板导入它即可。
<h1>Home</h1>
{% block content %}{% endblock %}
<h1>Hello!</h1>
</body></html>
这里
假设我们创建了一个“a.html”模板,在这个模板中,我们使用 block 控制语句来定义派生模板可以插入的地方,然后我们再写一个“b.html”模板:
{% extends "a.html" %}
{% block content %}
<h1>Content!</h1>
{% endblock %}
在这个模板中,我们使用extends语句来继承模板“a.html”,然后打开“b.html”我们就能看到这两个模板合在一起的内容了。
2.表单处理
一般网页都有登录功能,登录之前我们需要注册一个用户名,要实现注册的话我们就要给网页传递表单,处理方法:request对象和request.method。首先我们先写一个简单的带有注册功能的模板:
<html>
<head></head>
<body>
<h1>注册!</h1>
<form action="" method="POST">
用户名:<input type="text" name="username"/><br/>
密 码:<input type="password" name="password"><br/>
<input type="submit" name="commit"/>
</form>
</body>
</html>
打开模板之后我们就可以看到一个简单的注册网页了:
这时我们可以开始写一个注册程序了:
@app.route('/login/',methods=['GET','POST'])
def works():
if request.method == 'POST':
return u'%s 注册成功!'%request.form['username']
else:
return render_template('login.html')
这段程序将会做一个这样的动作,如果用户给网页POST一个表单,那么程序将返回一个xxx注册成功的页面,其中request.form['username']取的是我们传递给网页的username,若是GET方法,则调用request.args['']方法;如果没做POST动作,网页将停留在注册页面。
3.数据库
教程大多用的数据库都是sqlite3,不过用Mysql也是一样,我这里用的数据库就是Mysql,上面我们写了简单的注册程序,并没有将用户名、密码保存下来,这下我们有了数据库,就可以真正的实现注册功能了:
@app.route('/regisit/',methods=['POST','GET'])
def regisit():
if request.method == 'POST':
cxn = MySQLdb.connect(host='localhost', user='root', passwd='root',db='python')
username=request.form.get('username')
password=request.form.get('password')
con = cxn.cursor()
query="select username from data where username='%s' " %username
con.execute(query)
existaccount=con.fetchall()
if not existaccount:
con.execute('insert into data values(%s,%s)',[username,password])
cxn.commit()
return u'%s 注册成功!'%request.form['username']
else:
return u'%s 被注册了,请重新选择用户名!'%request.form['username']
else:
return render_template('regisit.html')
这里我们使用request.form.get('')方法把用户输入的帐号取到,然后再数据库中搜索是否有相同的用户名被注册过了,若有则注册失败,若没有则注册成功,并将新的用户名和密码保存到数据库中。现在我们有了数据库并且储存了一些用户名和密码,接下来我们便可以实现登录功能了,方法跟注册差不多,这里不再赘述。
4.cookies
有了登录功能之后,我们便可以用cookie的方式把数据放在浏览器端进行保留:
response=make_response(redirect('/'))
response.set_cookie('username',value=username,max_age=360)
return response
这里我们生成了一个response对象,然后用response对象调用set_cookie的方法对我们需要的信息进行保留,set_cookie(key,value=,max_age=)是set_cookie的原型,key中填cookie的名字,value填对应的值,而max_age为cookie的有效期,这样调用了之后我们将response对象返回给浏览器,浏览器中就会保存这个cookie了,倘若想要获取该cookie保存的信息的话,我们可以调用request.cookie.get()的方法进行获取。
5.session
session将数据保存在服务器端,session的基本操作:
app.secret_key=os.urandom(24)
这里我们产生一段随机字符串来赋值给session,session不需要response对象,直接调用session['key']=value即可:
session['username'] = username
return redirect('/new/')
做这样一个动作之后,我们打开浏览器就会看到Cookie中的session信息:
session中我们调用session.get()即可取到session中保存的信息了,以上我们通过cookie和session两种方法保存了用户的信息,若是用户想要注销呢?对于session方式,我们可以看出session是一个字典,只要按照字典的方法删除cookie即可;对于cookie方式,我们只需要改动max_age=0或者为负数,那么就成功注销了。
此时我们可以看到我们登录成功后响应cookie和请求cookie中均有session,然后我们点击注销:
点击注销后可以看到,响应cookie中的内容已经没有,说明已经注销成功。