浙教版必修2 利用flask开发简单Web应用
1
创建第一个网页应用程序
from flask import Flask #引入Flask包
app = Flask(__name__) #创建一个Web应用的实例app
@app.route('/') #指明地址是根路径
def index(): #当请求的地址符合路由规则时,就会进入该函数。
return 'Hello World'
if __name__ == '__main__': #启动Web服务器
app.run()
(左右滑动查看)
如果看到
Running on http://127.0.0.1:5000/(Press CTRL+C to quit)
说明服务器启动完成。
打开你的浏览器,访问http://127.0.0.1:5000/,可以看到“Hello World”。
2
带参数的路由
from flask import Flask #引入Flask包
app = Flask(__name__) #创建一个Web应用的实例app
@app.route('/hello/<name>')
def hello(name):
return 'Hello %s' % name
@app.route('/user/<int:user_id>')
def get_user(user_id):
return 'User ID: %d' % user_id@app.route('/content/<username>/<password>/')
def login(username, password):
return '我的用户名是:%s,密码是:%s' % (username, password)
if __name__ == '__main__': #启动Web服务器
app.run()
(左右滑动查看)
你将在页面上看到”Hello rose”的字样。
URL路径中/hello/后面的参数被作为hello()函数的name参数传了进来。
3
动态路由
from flask import Flask# 从flask框架中导入Flask类
app = Flask(__name__)# 传入__name__初始化一个Flask实例
app.config['JSON_AS_ASCII']=False
books = [
{'id': 1,'title': '三国演义'},
{'id': 2,'title': '水浒传'},
{'id': 3,'title': '西游记'},
{'id': 4,'title': '红楼梦'}
]
@app.route('/book/<int:book_id>')
def book_detail(book_id):
for book in books:
if book_id==book['id']:
return book
return "没有找到"
if __name__ == '__main__':
app.run()
(左右滑动查看)
@app.route装饰器中,可以指定URL的规则来进行更加详细的映射,比如现在要映射一个文章详情的URL,文章详情的URL是/ book /id/,id有可能为1、2、3…。
4
使用字符查询方法获取
from flask import Flask,request
app = Flask(__name__)
@app.route('/',methods=['GET'])
def hello():
name=request.args.get("name")#获取参数对应值
return "Hello"+name
@app.route('/user',methods=['GET'])
def user():
user=request.args.get('name')
psd=request.args.get('psd')
return "用户名:"+user+"密码:"+psd
if __name__ == '__main__':
app.run()
(左右滑动查看)
在@app.route()中可以传入一个关键字参数methods来指定本方法支持的HTTP方法,默认情况下,只能使用GET请求,通过传统的?=的形式来传递参数。
例如:/book?name=xxx&psd=xxx,这种情况下,可以通过request.args.get('name')来获取name的值。
如果是post方法,则可以通过 request.form.get('name')来进行获取。
5
post请求以及参数获取方式
from flask import Flask
from flask import request
app = Flask(__name__)
@app.route('/',methods=['POST'])
def hello_world():
name=request.form.get("name")#获取参数对应值
return name
if __name__ == '__main__':
app.run(host='127.0.0.1',port=5000) #本地地址,和端口号 localhost:5000时,body中传输name值,就会显示name变量,即hello
(左右滑动查看)
index.html
(左右滑动查看)
<form action="/login" method="post">
<p>用户名</p>
<p><input type="text" name="user" /></p>
<p><input type="submit" value="确定"/></p>
</form>
6
模板简介
模板是一个web开发必备的模块。因为我们在渲染一个网页的时候,并不是只渲染一个纯文本字符串, 而是需要渲染一个有富文本标签的页面。这时候我们就需要使用模板了。
(1)渲染模板
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run()
(左右滑动查看)
在当前目录下,创建一个子目录”templates”(注意,一定要使用这个名字)。然后在”templates”目录下创建文件”index.html”。
(2)参数传递
如果模板文件中有参数需要传递,应该怎么传呢?
from flask import Flask,render_template
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html',user='rose')
if __name__ == '__main__':
app.run()
(左右滑动查看)
模板文件index.html
<h1>欢迎您{{user}}</h1>
(3)Jinja2模版
#coding: utf8
from flask import Flask,render_template
app = Flask(__name__)
books = [
{
'id': 1,
'title': '三国演义',
'author': '罗贯中',
'profile': '《三国演义》是中国古典四大名著之一,是中国第一部长篇章回体历史演义小 说,全名为《三国志通俗演义》(又称《三国志演义》),作者是元末明初的著名小说家罗贯中。',
'price': '100'
},
{
'id': 2,
'title': '水浒传',
'author': '施耐庵',
'profile': '《水浒传》,是中国四大名著之一,全书描写北宋末年以宋江为首的108位好 汉在梁山聚义,以及聚义之后接受招安、四处征战的故事。',
'price': '90'
},
{
'id': 3,
'title': '西游记',
'author': '吴承恩',
'profile': '《西游记》为明代小说家吴承恩所著。取材于《大唐西域记》和民间传说、元 杂剧。宋代《大唐三藏取经诗话》(本名《大唐三藏取经记》)是西游记故事见于说话文字的最早雏形,
其中,唐僧就是以玄奘法师为原型的。',
'price': '120'
},
{
'id': 4,
'title': '红楼梦',
'author': '曹雪芹',
'profile': '《红楼梦》,中国古典四大名著之首,清代作家曹雪芹创作的章回体长篇小说 [1] ,又名《石头记》《金玉缘》。此书分为120回“程本”和80回“脂本”两种版本系统。新版通行本
前80回据脂本汇校,后40回据程本汇校,署名“曹雪芹著,无名氏续,程伟元、高鹗整理”[2] 。后40
回作者尚有争议,但是对于矮化甚至腰斩后40回的极端倾向也应保持警惕。',
'price': '110'
}
]
@app.route('/')
def hello_world():
return render_template('index.html', books=books)
@app.route('/detail/<id>/')
def book_detail(id):
id = int(id)-1
return render_template('bookcontent.html', books=books, i=id)
if __name__ == '__main__':
app.run()
(左右滑动查看)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>四大名著</title>
</head>
<style>
#table_test tr{
width: 50px;
}
#table_test tr td{
width: 70px;
}
</style>
<body>
<table border="1" id="table_test">
<thead>
<tr bgcolor="#f0f8ff">
<td>id</td>
<td>书名</td>
<td>作者</td>
<td>价格</td>
</tr>
</thead>
<tbody>
{% for book in books %}
<tr>
<td>{{ book.id }}</td>
<td><a href="{{url_for('book_detail', id=book.id) }}">{{
book.title }}</a></td>
<td>{{ book.author }}</td>
<td>{{ book.price }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
(左右滑动查看)
bookcontent.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>书籍详情</title>
</head>
<body>
<p>{{ books[i].profile }}</p>
</body>
</html>
(左右滑动查看)
{{ ... }}:
用来装载一个变量,模板渲染的时候,会把这个变量代表的值替换掉。并且可以间接访问一个变量的属性或者一个字典的key。
关于点.号访问和[]中括号访问,没有任何区别,都可以访问属性和字典 的值。
{% ... %}:
所有的控制语句都是放在{% ... %}中,并且有一个语句{% endxxx %}来进行结束,Jinja中常用的控制语句有if/for..in.
{# ... #}:
用来装载一个注释,模板渲染的时候会忽视这中间的值。
7
小型数据库sqlite的使用
1.创建数据库文件
建立数据库文件data.db,建立数据表users,3个字段(主键id+用户名name+ 密码password),插入2条记录:
import sqlite3
import datetime
DATABASE = 'data/data.db'
def setup_db1():
db = sqlite3.connect(DATABASE)
cur = db.cursor()
cur.execute("CREATE TABLE IF NOT EXISTS users(id INTEGER PRIMARY KEY autoincrement,name text, password text)")
cur.execute("INSERT INTO users(name,password) VALUES('%s','%s')" % ('visit', '111')) cur.execute("INSERT INTO users(name,password) VALUES('%s','%s')" % ('admin', '123'))
db.commit()
def readdata():
db = sqlite3.connect(DATABASE) cur = db.cursor()
cur.execute("SELECT * FROM users ")
data = cur.fetchall()
cur.close()
db.close()
print(data)
if __name__ == "__main__":
setup_db1()
readdata()
(左右滑动查看)
2.编写index.html(用于输入用户名+密码,表单提交)
<form name="login" action="/login" method="post">
Username: <input type="text" name="user" /><br>
Password: <input type="password" name="passwd" /><br>
<input type="submit" value="Submit" />
</form>
(左右滑动查看)
3.操作SQLite(增、删、改、查操作),编写程序文件login.py
import sqlite3
from flask import Flask,render_template, request,redirect,jsonify
DATABASE='data/data.db'
app = Flask(__name__)
@app.route('/')
def index():
db = sqlite3.connect(DATABASE)
cur = db.cursor()
cur.execute("SELECT * FROM users ")
data = cur.fetchall()
cur.close()
db.close()
return render_template('login.html')
@app.route('/login', methods=['POST', 'GET'])
def login():
db = sqlite3.connect(DATABASE)
cur = db.cursor()
if request.method == 'POST':
name = request.form['user']
passwd = request.form['passwd']
cursor = cur.execute('select * from users where name=? and password=?', [name, passwd])
if cursor.fetchone() is not None:
return 'Login successfully!'
else:
return 'No such user!'
else:
return render_template('login.html')
if __name__ == '__main__':
app.run()
(左右滑动查看)