Flask笔记:(Flask开发基础与入门)
MacOS:sudo pip installflask
Flask,需要下载重要的三个包:Werkzeug,Jinja2,Flask。
-
路由和反向路由,
路由:可以理解为:通过url转到另一个地址或者接口
源代码:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
@app.route('/doc')
def hello_doc():
return 'This is my first flask'
这段是仿上面的写的,也就是增加一个doc的路由(转到另一个接口),从http://127.0.0.1:5000/doc可以顺利访问。
@ app.route ( '/doc' , methods =[ 'GET' ])如果不指定,默认的是GET方法,也可以这样修改为POST方法:
@ app.route ( '/doc' , methods =[ 'POST' ])【GET - 从指定的资源请求数据;POST - 向指定的资源提交要被处理的数据】
@ app.route ( '/users/<id>' )
def user_id (id):
return 'Hi User:' +id
<id>和函数的参数名称要一致:
http://127.0.0.1:5000/users/Ben 可正常访问,结果就是:Hi User:Ben。
换一种方式获取参数:(fromflask import Flask,request)
@ app.route ( '/q_user' )def query_user ():
id=request.args.get( 'id' )
return 'q_user:' +id
/q_user之后接?id=Kate:
http://127.0.0.1:5000/q_user?id=Kate 顺利访问:q_user:Kate
反向路由:可以理解为从地址反向导出url字符串:(from flask import Flask,request, url_for)
@ app.route ( '/q_user' )def query_user ():
id=request.args.get( 'id' )
return 'q_user:' +id
@ app.route ( '/query_url' )
def getUrl ():
return 'The URL is:' +url_for( 'query_user' )
访问:http://127.0.0.1:5000/query_url 结果:The URL is:/q_user
其中url_for('query_user')就是得到/q_user字符串的方法。
Flask模板:
为了使HelloWorld字体变大,可以这样写:
@ app.route ( '/' )def hello_world ():
return '<h1>Hello World!</h1>'
但是python代码中加入html会混乱,更何况还有js等文件,所以使用模板。
在templates文件夹下,创建hello.html
同时在python里面引入render_template方法:
@ app.route ( '/' )def hello_world ():
return render_template( "hello.html" )
# return '<h1>Hello World!</h1>'
render_template("hello.html") 即跳转指定文件。
-------------------------------
用这种方法操纵html内容:
在html中,用双花括号语法包裹内容:body里面写内容:
<h2> {{ context_test }} </h2>在py文件里:
@ app.route ( '/' )def hello_world ():
content = "This is from python"
return render_template( "hello.html" , context_test =content)
即,通过双花括号内赋变量,实现调用python内容。
--------------------------------------
创建models.py,存放user类:
class User ( object ):def __init__ ( self , user_id , user_name):
self .user_id = user_id
self .user_name = user_name
在FlaskTest里导入这个类:
from models import User新建user.html输出user对象:
<h1> 你好, {{ user . user_name }} </h1>在FlaskTest里:
@ app.route ( '/user' )def user_index ():
userNew = User( 1 , 'gamer' )
return render_template( "user.html" , user = userNew)
新建一个User对象,id是1,name是gamer
http://127.0.0.1:5000/user 得到结果:你好,gamer
-------------------------------------------
添加if判断,如果有此用户,则返回某个值,如果没有此用户,则返回一个消息:
@ app.route ( '/query_user/<user_id>' )def query_user (user_id):
user_content = None
if int (user_id) == 1 :
user_content = User( 1 , 'KangLeHealthy' )
return render_template( "user_id.html" , user = user_content)
user_content对象赋给html中相应的对象。
在user_id.html中添加如下代码:
{% if user %}
<h3>你好,{{ user.user_name }}</h3>
{% else %}
<h1>没有此用户</h1>
{% endif %}
访问:http://127.0.0.1:5000/query_user/1正常访问,你好,KangLeHealthy;
访问:http://127.0.0.1:5000/query_user/2结果:没有此用户
-------------------------------------------------------
循环语句:
@ app.route ( '/users' )def user_list ():
user_list = []
for i in range ( 1 , 11 ):
user = User(i , 'NewUser' + str (i))
user_list.append(user)
return render_template( "user_list.html" , users = user_list)
user_list.html中:
{% for user in users %}{{ user . user_id }}----{{ user . user_name }} <br>
{% endfor %}
访问:http://127.0.0.1:5000/users 得到结果:1----NewUser1
---------------------------------------------
模板继承:
---------------------------------------------
模板继承:
定义基类:(其他标准的H5默认内容不变)
<body>
<h1>标题:PythonFlask测试</h1>
<div>
{% block content %}
{% endblock %}
</div>
<h1>友情链接:学院网</h1>
</body>
注意,可变部分为中间div包裹的block块,语法是{%block %}--{%endblock%}
--定义子类:oneBase.html全部内容:
{% extends "base.html" %} {# 这里继承基类 #}
{% block content %}
<h2>首页,写入大体的内容</h2>
{% endblock %}
--定义子类:twoBase.html全部内容:
{% extends "base.html" %} {# 这里继承基类 #}
{% block content %}
<h2>细节,关于关键网站的内容</h2>
{% endblock %}
在python写入路由:
@app.route('/one')
def oneBase():
return render_template("oneBase.html")
@app.route('/two')
def twoBase():
return render_template("twoBase.html")
访问http://127.0.0.1:5000/one测试正常。