vlambda博客
学习文章列表

浙教版必修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)

浙教版必修2 利用flask开发简单Web应用

说明服务器启动完成。

打开你的浏览器,访问http://127.0.0.1:5000/,可以看到“Hello World”。

浙教版必修2 利用flask开发简单Web应用

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…。


浙教版必修2 利用flask开发简单Web应用


浙教版必修2 利用flask开发简单Web应用

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()

(左右滑动查看)


浙教版必修2 利用flask开发简单Web应用


在@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

(左右滑动查看)


浙教版必修2 利用flask开发简单Web应用


浙教版必修2 利用flask开发简单Web应用


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 利用flask开发简单Web应用


(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>

(左右滑动查看)

浙教版必修2 利用flask开发简单Web应用

浙教版必修2 利用flask开发简单Web应用

浙教版必修2 利用flask开发简单Web应用

{{ ... }}:

用来装载一个变量,模板渲染的时候,会把这个变量代表的值替换掉。并且可以间接访问一个变量的属性或者一个字典的key。

关于点.号访问和[]中括号访问,没有任何区别,都可以访问属性和字典 的值。

{% ... %}:

所有的控制语句都是放在{% ... %}中,并且有一个语句{% endxxx %}来进行结束,Jinja中常用的控制语句有if/for..in.

{# ... #}:

用来装载一个注释,模板渲染的时候会忽视这中间的值。

7




小型数据库sqlite的使用


1.创建数据库文件

建立数据库文件data.db,建立数据表users,3个字段(主键id+用户名name+ 密码password),插入2条记录:

浙教版必修2 利用flask开发简单Web应用


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>

(左右滑动查看)

浙教版必修2 利用flask开发简单Web应用

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()

(左右滑动查看)

推荐阅读   点击标题可跳转