文章目录
一、什么是Web框架?
- 已经封装好了一段代码,协助程序快速开发,相当于项目半成品
- 开发者只需要按照框架约定要求,在指定位置写上自己的业务逻辑代码
- 例如:在某个区需要成立一家医院,有两种方式:
- 圈地,打地基,盖楼,装修,入驻
- 买楼,装修,入驻
二、为什么要用Web框架?
1.web网站发展至今,特别是服务器端,涉及到的知识、内容,非常广泛。这对程序员的要求会越来越高。如果采用成熟,稳健的框架,那么一些基础的工作,比如,安全性,数据流控制等都可以让框架来处理.
2.程序开发人员可以把精力放在具体的业务逻辑上面。
总结:降低开发难度,提高开发效率,不需要重复造轮子
三、Python 中常用的Web框架,特点
1.flask: 提供基本功能,属于轻量级
2.django: 提供相对完整功能,重量级
3.tornado: 偏嵌入式web应用,非阻塞式服务器
四、Flask常用扩展包
- Flask-SQLalchemy:操作数据库;
- Flask-script:插入脚本;
- Flask-migrate:管理迁移数据库;
- Flask-Session:Session存储方式指定;
- Flask-WTF:表单;
- Flask-Mail:邮件;
- Flask-Bable:提供国际化和本地化支持,翻译;
- Flask-Login:认证用户状态;
- Flask-OpenID:认证;
- Flask-RESTful:开发REST API的工具;
- Flask-Bootstrap:集成前端Twitter Bootstrap框架;
- Flask-Moment:本地化日期和时间;
- Flask-Admin:简单而可扩展的管理接口的框架
五、第一个flask程序
#coding=utf-8
#从flask包中导入Flask对象
from flask import Flask
# 使用Flask创建一个app对象,并且传递__name__参数
app = Flask(__name__)
# app.route装饰器:设置访问的url,这里是设置成一个根路径。
# 这个设置将根URL映射到了hello_world函数上
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
# 运行本项目,host=0.0.0.0可以让其他电脑也能访问到该网站,port指定访问的端口。默认的host是127.0.0.1,port为5000
app.run(host='0.0.0.0',port=3000,debug=True)#设置Debug使网页自动刷新
返回中文显示ASCII
添加这一小行代码即可
app.config['JSON_AS_ASCII']=False
配置项单词都是大写
六、URL与视图
URL与函数的映射
#coding=utf-8
#从flask包中导入Flask对象
from flask import Flask,jsonify
import config
# 使用Flask创建一个app对象,并且传递__name__参数
app = Flask(__name__)
#所有的配置项可以放到config中
app.config.from_object(config)
books=({"id":1,"name":"三国演义"},
{"id":2,"name":"水浒传"},
{"id":3,"name":"红楼梦"},
{"id":4,"name":"西游记"})
@app.route("/book/<int:book_id>")
def book_detail(book_id):
for book in books:
if book_id==book["id"]:
return book
return f"id为{book_id}的图书没有找到"
@app.route("/book/list")
def book_list():
return jsonify(books)
# app.route装饰器:设置访问的url,这里是设置成一个根路径。
# 这个设置将根URL映射到了hello_world函数上
@app.route('/')
def hello_world():
#return 'Hello World!'
return {"username":"孙悟空"}
if __name__ == '__main__':
# 运行本项目,host=0.0.0.0可以让其他电脑也能访问到该网站,port指定访问的端口。默认的host是127.0.0.1,port为5000
app.run(host='0.0.0.0',port=3000,debug=True)
构造URL(url_for)
一般我们通过一个URL就可以执行到某一个函数。如果反过来,我们知道一个函数,怎么去获得这个URL呢?url_for函数就可以帮我们实现这个功能。url_for()函数接收两个及以上的参数,他接收函数名作为第一个参数,接收对应URL规则的命名参数,如果还出现其他的参数,则会添加到URL的后面作为查询参数。
@app.route("/book/<int:book_id>")
def book_detail(book_id):
for book in books:
if book_id==book["id"]:
return book
return f"id为{book_id}的图书没有找到"
@app.route("/book/list")
def book_list():
for book in books:
book["url"]=url_for("book_detail",book_id=book["id"])
return jsonify(books)
指定HTTP方法
在@app.route()中可以传入一个关键字参数methods来指定本方法支持的HTTP方法,默认情况下,只能使用GET请求,看以下例子:
@app.route("/book/<int:book_id>",methods=["post"])#此时为post,无法访问
def book_detail(book_id):
for book in books:
if book_id==book["id"]:
return book
return f"id为{book_id}的图书没有找到"
#1.如果只是从服务器上获取数据,GET
#2.如果前端需要把数据发给服务器,一般用POST请求
#3.再@app.route上,添加methods参数,这个参数是一个列表类型,可以传递多个
页面跳转和重定向
重定向分为永久性重定向和暂时性重定向,在页面上体现的操作就是浏览器会从一个页面自动跳转到另外一个页面。比如用户访问了一个需要权限的页面,但是该用户当前并没有登录,因此我们应该给他重定向到登录页面。
永久性重定向:http的状态码是301,多用于旧网址被废弃了要转到一个新的网址确保用户的访问,最经典的就是京东网站,你输入www.jingdong.com的时候,会被重定向到www.jd.com,因为jingdong.com这个网址已经被废弃了,被改成jd.com,所以这种情况下应该用永久重定向。
暂时性重定向:http的状态码是302,表示页面的暂时性跳转。比如访问一个需要权限的网址,如果当前用户没有登录,应该重定向到登录页面,这种情况下,应该用暂时性重定向。
在flask中,重定向是通过flask.redirect(location,code=302)
这个函数来实现的,location表示需要重定向到的URL,应该配合之前讲的url_for()函数来使用,code表示采用哪个重定向,默认是302也即暂时性重定向,可以修改成301来实现永久性重定向。
@app.route('/profile')
def profile():
#参数传递的两种形式:
#1.作为url的组成部分:/book/1
#2.查询字符串:/book?id=1
user_id=request.args.get("id")
if user_id:
return "用户个人中心"
else:
return redirect(url_for("index"))