方法一:终端命令行下输入 Python
方法二:终端命令行输入 python -V
注意:Python版本最好是当前最新版本(最低不能低于3.7)
python
python -V
$ mkdir myproject
$ cd myproject
$ python3 -m venv venv
在终端命令行窗口中执行
. venv/bin/activate
#或者使用一下代码激活虚拟环境
source venv/bin/activate
pip install Flask
pip freeze 检查安装版本号
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello_world():
return "Hello
"
$ export FLASK_APP=hello
$ flask run
作用使用有意义的URL方便用户记忆
from flask import Flask
app=Flask(__name__)
#路由index,跳转index路由页面
@app.route('/index')
def index():
return 'index
'
#路由home,跳转home路由页面
@app.route('/home')
def home():
return 'home
'
from flask import Flask
app=Flask(__name__)
@app.route('/index/' )
def index(name):
return 'index,接受的值为{}
'.format(name)
2. 服务端要求客户端传递某一种数据类型参数
客户端通过URL向服务器传递某一种类型参数
from flask import Flask
app=Flask(__name__)
@app.route('/index/' )
def index(name):
return 'index,接受的值为{}
'.format(name)
调试模式默认是禁用的
(venv) $ export FLASK_APP=hello.py
(venv) $ export FLASK_DEBUG=1
(venv) $ flask run
app.run(debug=True)
from flask import Flask
app=Flask(__name__)
@app.route('/index/' )
def index(name):
return 'index,接受的值为{}
'.format(name)
@app.route('/home/' )
def home(cname):
return 'home{}
'.format(cname)
if __name__=="__main__":
app.run(debug=True)
from manage import app
#请求上下文包
from flask import current_app
#激活上下文
app_ctx=app.context()
#自动获取上下文
app_ctx.push()
#请求上下文
current_app.name
#关闭请求上下文
app_ctx.pop()
flask通过app.route装饰器或者app.add_url_rule()方法构建URL
通过app.url_map查询flask创建路由情况,客户端对应请求方式, 视图函数
属性方法 | 说明 |
---|---|
form | 一个字典,存储请求提交的所有表单字段 |
args | “一个字典,存储通过 URL 查询字符串传递的所有参数” |
values | “一个字典,form 和 args 的合集 |
cookies | “一个字典,存储请求的所有 cookie” |
headers | “一个字典,存储请求的所有 HTTP 首部” |
files | 一个字典,存储请求上传的所有文件 |
get_data() | 返回请求主体缓冲的数据 |
get_json() | 返回一个 Python 字典,包含解析请求主体后得到的 JSON |
blueprint | 处理请求的 Flask 蓝本的名称 |
endpoint | 处理请求的 Flask 端点的名称 |
method | HTTP 请求方法,例如 GET 或 POST |
scheme | URL 方案(http 或 https ) |
is_secure() | 通过安全的连接(HTTPS)发送请求时返回 True |
在请求开始之前或者之后代码会很有用,例如:我们要创建数据库链接或者发起用户的身份认证
注册函数 作用是为了比避免在每视图函数中重复调用
注册函数根据请求分配到视图函数
4种请求钩子(注册函数)
在客户端发出请求后Flask调用视图函数后,返回内容叫做响应
响应状态码 返回响应需要使用不同的状态码用来表示请求是否有效
通过make_response()返回一个响应对象
#引入包
from flask import Flask,make_response
app=Flask(__name__)
#创造响应对象
@app.route('/home')
def home():
response=make_response('this document Carries a cookie
')
return response
响应对象常见属性方法
属性方法 | 说明 |
---|---|
tatus_code | HTTP 数字状态码 |
headers | 一个类似字典的对象,包含随响应发送的所有首部 |
set_cookie() | 为响应添加一个 cookie |
delete_cookie() | 删除一个 cookie |
content_length | 响应主体的长度 |
content_type | 响应主体的媒体类型 |
set_data() | 使用字符串或字节值设定响应 |
get_data() | 获取响应主体 |
##响应重定向
作用 告诉浏览器一个新的URL,加载新的页面
状态码 302
from flask import Flask,redirect
app=Flask(__name__)
@app.route('/')
def main():
return redirect('http://www.baidu.com')
使用情况 如果需要做用户id认证判断是否为真实用户
abort判断不是真实用户会从服务器端直接终止响应
from flask import abort
@app.route('/usr/' )
def usr(id):
if str(id)!="hello":
abort(401)
return "输入id为{}
".format(id)
给Flask实例传递一个关键字参数template_folder,指定具体的路径用来改变模板路径
from flask import Flask
app=Flask(__name__,template_folder='./templates')
from flask import Flask,render_template
app=Flask(__name__,template_folder='./templates')
@app.route('/')
def home():
return render_template('main.html')
if __name__=='__main__':
app.run(debug=True)
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<h1>{{name}}h1>
body>
html>
from flask import Flask,render_template
app=Flask(__name__)
@app.route('/')
def home():
id='hello'
return render_template('main.html',name=id)
if __name__=='__main__':
app.run(debug=True)
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<h1>{{name}}h1>
<h1>{{age}}h1>
<h1>{{sex}}h1>
body>
html>
from flask import Flask,render_template
app=Flask(__name__)
@app.route('/')
def home():
context={
'name':'zhangsan',
'age':18,
'sex':'男'
}
return render_template('main.html',**context)
if __name__=='__main__':
app.run(debug=True)
语法:{{name|filt_name}}
name变量名
filt_name 过滤器名称
过滤器名称 | 说明 |
---|---|
safe | 渲染值时不转义 |
capitalize | 把值的首字母转换成大写,其他字母转换成小写 |
lower | 把值转换成小写形式 |
upper | 把值转换成大写形式 |
title | 把值中每个单词的首字母都转换成大写 |
trim | 把值的首尾空格删掉 |
striptags | 渲染之前把值中所有的 HTML 标签都删掉 |
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
<h1>{{name|length}}h1>
<h1>{{age}}h1>
<h1>{{sex}}h1>
body>
html>
from flask import Flask,render_template
app=Flask(__name__)
@app.route('/')
def home():
context={
'name':'zhangsan',
'age':18,
'sex':'男'
}
return render_template('main.html',**context)
if __name__=='__main__':
app.run(debug=True)
在这里插入代码片
模板
{%if 判断语句%}
代码块
{%elif判断语句%}
代码块
{%else%}
代码块
{%endif%}
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
{% if age > 10 %}
<h1>大于10h1>
{%elif age <10%}
<h1>小于10h1>
{%else%}
<h1>既不小于10也不大于10h1>
{%endif%}
<h1>h1>
body>
html>
from flask import Flask,render_template
app=Flask(__name__)
@app.route('/')
def home():
context={
'name':'zhangsan',
'age':18,
}
return render_template('main.html',**context)
if __name__=='__main__':
app.run(debug=True)
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
{%for i in PhoneNumber %}
<ul>
<li>电话号码:{{i}}li>
ul>
{%endfor%}
body>
html>
from flask import Flask,render_template
app=Flask(__name__)
@app.route('/')
def home():
context={
'name':'zhangsan',
'age':18,
'sex':'男',
'PhoneNumber':[188888888888,13312341234,18999999999]
}
return render_template('main.html',**context)
if __name__=='__main__':
app.run(debug=True)
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Documenttitle>
head>
<body>
{%for key,value in msg.items() %}
<ul>
<li>{{key}}---->>>>{{value}}li>
ul>
{%endfor%}
body>
html>
from multiprocessing import context
from flask import Flask,render_template
app=Flask(__name__)
@app.route('/')
def home():
context={
'name':'zhangsan',
'age':18,
'sex':'男',
'PhoneNumber':[188888888888,13312341234,18999999999],
'msg':{'学号':'0927','班级':'三年级二班',}
}
return render_template('main.html',**context)
if __name__=='__main__':
app.run(debug=True)
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title> {% block title %}{% endblock %} title>
head>
<body>
<ul>
<li>
<a href="/">首页a>
li>
<li>
<a href="/blog">博客a>
li>
<li>
<a href="/msg">信息a>
li>
ul>
{% block body %}{% endblock %}
<footer style="background-color: rgba(29, 29, 59, 0.333);">我是底部footer>
body>
html>
{% extends 'father.html' %}
{% block title %}
个人信息
{% endblock %}
{% block body %}
<h1>我的个人信息h1>
{% endblock %}
<a href="/">首页a>
<a href="/blog">博客a>
<a href="/msg">个人信息a>
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title> {% block title %}{% endblock %} title>
head>
<body>
{% include 'navigation.html' %}
{% block body %}{% endblock %}
<footer style="background-color: rgba(29, 29, 59, 0.333);">我是底部footer>
body>
html>
虚拟环境下安装依赖
(venv) $ pip install flask-wtf
SECRTE_KEY可以是任意字符串
app = Flask(__name__)
#配置秘钥
app.config['SECRET_KEY']='这是一个防止CSRF秘钥'
#引入flask_wtf中FlaskForm类
from flask_wtf import FlaskForm
#引入字段属性包如StringField是type=text
from wtforms import StringField,SubmitField
#引入校验器
from wtforms.validators import DataRequired
#创建子类继承FlaskForm父类
class NameForm(FlaskForm):
iname=StringField('What is you name?',validators=[DataRequired()])
submit=SubmitField('提交')
二实例化列表传给客户端
@app.route('/',methods=['GET','POST'])
def index():
#实例化定义的form表单
form=NameForm()
name=None
#验证表单是否被提交
if form.validate_on_submit():
name=form.iname.data
form.iname.data=''
return render_template('index.html',form=form,name=name)