一、概况
Python Web框架有很多个,比如Django、Flask、Tornado等框架。这个三个框架在Web端是比较有影响力的,尤其是Django框架,在快速开发上占有一定的优势。但是Django框架属于重量级框架,它能想到的功能都会事先帮你想好。你只要按照它的模块要求写,一个网站就能很快速搭建出来。
Flask和Tornado框架就属于轻量级框架了,它只提供最核心的功能,其余的功能需要用自己手写或者用第三方来支持。那么到底是用Djnago还是用Flask。如果业务变化快,可以选用Flask,自己来搭建符合自己公司业务后端架构。如果业务基本不变,可以选用Django,开发起来速度比较快。Flask框架最为Python后端新生代的代表!
如果突然报错!
临时解决办法:
$ ps -fA | grep python
henry 127112 1181 0 12:07 ? 00:00:05 /usr/bin/python /usr/bin/x-terminal-emulator
henry 127201 124727 0 12:09 ? 00:00:01 python3 -u /home/henry/dev/myproject/flaskr/flaskr.py
henry 127252 127122 0 12:20 pts/4 00:00:00 grep --color=auto python
$ kill 127201
目前Flask的文档是1.0版本
英文文档 http://flask.pocoo.org/docs/1.0/
中文文档 http://docs.jinkan.org/docs/flask/index.html
三、环境搭建
首先安装虚拟环境,命令如下:
sudo pip3 install virtualenv
接下来还要安装虚拟环境扩展包,命令如下:
sudo pip3 install virtualenvwrapper
安装虚拟环境包装器的目的是使用更加简单的命令来管理虚拟环境。
修改用户家目录下的配置文件.bashrc,添加如下内容:
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source /usr/local/bin/virtualenvwrapper.sh
然后执行source .bashrc让配置生效。
创建一个名字为 flask_1.0的环境:
mkvirtualenv flask_1.0
安装Flask
pip install flask
创建Flask项目
首先打开pycharm 左上角new project
配置目录名 和虚拟环境 点击create 创建
写一个最简单的代码呈现
运行效果
代码呈现:
from flask import Flask
"""
__name__ :表示当前模块名字
创建Flask对象,Flask会传入模块的位置当做家目录
"""
app = Flask(__name__)
@app.route('/') # 代表首页
def hello_world(): # 视图函数
return 'Hello World!'
if __name__ == '__main__':
app.run() # 运行程序
运行 python 你的当前py文件
按住CTRL 点击
会出现源码 这里面初始化了好多方法
所以我们用,逗号间隔 书写我们要配置的参数
所以我们要在左侧的 static目录 创建一个html文件 里面书写一些文字
仔细观察下路径
原路径
自己设定的1807路径
我们可以设置一个配置文件 config.cfg这个代表 配置debug 之后可以 自动检测运行服务器时的报错
TEST 是我们随便起的变量 我们可以轻松利用
当我们运行当前文件时 会打印积极
来调用在我们的视图函数里 并打印在命令横中
同时 我们在去 配置DEbug
在if name == ‘main’:前面 来配置
# 配置文件
app.config.from_pyfile('config.cfg')
还有几种不用写文件配置的方法 我推荐写文件方法
类方式配置
class Config(object):
DEBUG = True
app.config.from_object(Config)
直接操作
app.config["DEBUG"] = True
对象上配置
app.debug = True
参数传入配置(只限debug参数)
app.run(debug=True) # 运行程序
重定向
首先导入我们需要的两个
当我们重定向 center函数时
代码如下
@app.route('/center')
def center():
return 'center'
@app.route('/mycenter')
def mycenter():
return redirect(url_for('center')) #函数名
当我们去请求mycenter时
这时 他的路径会自动变成center
如果想要路径不变 就要在绑定一个路由 所以一个视图可以绑定多个路由
代码呈现
# 一个视图可以绑定多个路由
@app.route('/mycenter')
@app.route('/center')
def center():
return 'center'
@app.route('/mycenter')
def mycenter():
return redirect(url_for('center')) #函数名
这时我们在访问 mycenter 路径就在也不会变了
上述都是通过get 来访问请求 我们也可以通过设置get post来访问
代码呈现
@app.route('/myorder',methods=['POST','GET'])
def order():
return 'myorder'
当我们使用post 访问时 就要使用到postman 软件 来访问 得到我们想要的结果
转换器
我们在访问页面时可以携带参数 一般我们携带的是str 字符串 以下还提供了三种类型 int 整数 float 小数 path 可以放带/的路径
第一个运行结果
第二个运行结果
第三个运行结果
设置自定义转换器匹配手机号
# 自定义转换器 匹配手机号
from werkzeug.routing import BaseConverter
class MyConverter(BaseConverter):
def __init__(self,map):
super().__init__(map) # 调用父类 父类会初始化一些东西
self.regex = r"1[3456789]\d{9}"
# 注册转化器
app.url_map.converters['rephone'] = MyConverter
@app.route("/register/<rephone:phone>")
def register(phone):
# app.url_map 打印 所有视图的url配置
print(app.url_map)
print(phone)
return '注册成功'
在上述代码中 类继承了BaseConverter方法 调用父类初始化的一些参数 然后重写正则匹配手机号 进行 转换器注册类 设置路由返回结果
这时我们要先看下源码BaseConverter在这当中初始化了两个方法 我们要继承map视图 和regex 匹配正则
这里的converters 也是源码中的方法 让我们看下
点击converters进入 然后选中 ctrl+f进行搜索
点击回车
再点击回车
我们看到这个方法被converters而接收 所以我们使用它
通用自定义转换器
我们先看下大神写的流程
上我们的代码
from werkzeug.routing import BaseConverter
# 通用调用自定义转换器
class MyConverter1(BaseConverter):
def __init__(self,map,re):
super().__init__(map) # 调用父类 父类会初始化一些东西
self.regex = re
def to_python(self, value):
return value
def to_url(self, value):
return '12388888888'
# 注册转化器
app.url_map.converters['re'] = MyConverter1
@app.route("/myregister/<re(r'\d{11}'):uid>")
def myregister(uid):
print(uid)
return str(uid)
@app.route("/register/<re(r'1[3456789]\d{9}'):phone>")
def register(phone):
return redirect(url_for("myregister",uid=phone)) # 重定向才执行 to_url
代码流程
按照流程发起请求
得到结果
少输一位试试 请求不到
Flask之模板初识
首先导入
代码如下
from flask import render_template
@app.route('/templat')
def templat():
ctx = {
"name": '老王',
"age": 12,
"hobby": ["下棋", '电影'],
"test": {
"a": 1, "b": 2}
}
return render_template('templat.html', **ctx) # 一定要是关键字参数 **ctx
绘制模板 首先在templates里面创建一个 templat的html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
名字: <span>{
{ name }}</span> <br>
年龄: <span>{
{ age }}</span> <br>
取列表第一个: <span>{
{ hobby[0] }}</span><br> 代表取列表第一个 取索引
取字典a对应的值:<span>{
{ test.a }}</span><br> 代表取列表第一个 取值
</body>
</html>
呈现效果
标签遍历取值
<ul>
{% for r in hobby %}
<p>{
{ r }}</p>
{% endfor %}
</ul>
查询标签索引
效果
过滤器
长度过滤器:
{
{ name|length }}<br>
默认过滤器,当后台没有返回sex的时候会执行:
{
{ sex|default('男') }}<br>
反转过滤器:
{
{ name|reverse }}<br>
效果
自定义过滤器
# 自定义过滤器
def handletime(time,*index):
return time.strftime('%Y-%m-%d %H:%M')
def add(nums,nums1):
return nums+5
app.jinja_env.filters['handletime'] = handletime # 注册过滤器
app.jinja_env.filters['add'] = add
GET 请求
首先访问register.html 页面 提交请求 并把值传给/rese/add 返回数据
from flask import Flask, request
@app.route('/rese') # 代表首页
def index(): # 视图函数
return render_template('register.html')
# get请求
@app.route('/rese/add') # 代表个人中心页
def rese(): # 视图函数
if request.method