1,flask环境安装
安装python;
打开cmd窗口,pip install flask#安装flask
安装pycharm,最好是professional版本(闲鱼)
2,URL与视图
URL与视图映射:
定义多个app.route,即可使多个url对应多个页面
以下定义了ip:port/、ip:port/index、ip:port/blog/list,一个3个url映射
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world(): # put application's code here
return 'Hello World!'
@app.route('/index')
def index():
return '我是index'
@app.route('/blog/list')
def blog_list():
return '我是博客列表'
if __name__ == '__main__':
app.run()
带参URL
带参数的url可传递参数
@app.route('/blog/<blog_id>')
def blog_list(blog_id):
return '您访问的博客是:%s' % blog_id
访问ip:port/blog/123时,页面打印“您访问的博客是:123”
带查询字符串的URL:使用request
from flask import request
@app.route('/book/list')
def book_list():
page = request.args.get("page", default=1, type=int)
return f'您获取的是第{ page }页的图书列表'
访问:ip:port/book/list时,打印:您获取的是第1页的图书列表
访问:ip:port/book/list?page=3时,打印:您获取的是第3页的图书列表
3,Jinja2功能
模板渲染:使用render_template
在templates文件夹中,添加index.html文件
index.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>这是首页</title>
</head>
<body>
<h1>测试jinja模板渲染功能</h1>
</body>
</html>
app.py文件
from flask import render_template
@app.route('/')
def hello_world(): # put application's code here
return render_template("index.html")
访问:ip:port/时,则会访问index.html
模板传参
app.py文件
#第一种传参方式
@app.route('/blog/<blog_id>')
def blog_detail(blog_id):
return render_template("index.html", blog_id=blog_id, author="小帅")
#第二种传参方式
@app.route('/blog')
def blog_detail():
blog_id = request.args.get("blog_id", default=1, type=int)
return render_template("index.html", blog_id=blog_id, author="小帅")
index.html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>这是博客</title>
</head>
<body>
<h1>你访问的博客id是:{{ blog_id }},作者是:{{ author }}</h1>
</body>
</html>
第一种访问:ip:port/blog/123,页面打印:“你访问的博客id是:123,作者是:小帅”
第二种访问:1)访问:ip:port/blog时,打印:"你访问的博客id是:1,作者是:小帅"; 2)访问:ip:port/blog?blog_id=123时,打印:"你访问的博客id是:123,作者是:小帅"
模板访问对象属性或字典成员
在app.py中定义类和字典
class Teacher:
def __init__(self, name, age):
self.name = name
self.age = age
student = {
"name": "张三",
"gender": "男生"
}
@app.route('/teacher_info')
def teacher_info():
teacher = Teacher(name="王老师", age="40")
return render_template("index.html", teacher=teacher, student=student)
在index.html中访问
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>老师信息</title>
</head>
<body>
<div>老师是:{{ teacher.name }},年龄是:{{ teacher.age }}</div>
<div>学生是:{{ student.name }},性别是:{{ student.gender }}</div>
</body>
</html>
访问:ip:port/teacher_info后,页面打印:“老师是:王老师,年龄是:40 学生是:张三,性别是:男生”
jinja2过滤器
jinja2有包括length在内30多个过滤器,用管道符号“|”使用,还可以使用app.add_template_filter()函数自定义过滤器
仍然采用上述例子,把index.html修改为:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>老师信息</title>
</head>
<body>
<div>学生姓名长度为:{{ student.name | length}}</div>
</body>
</html>
访问:ip:port/teacher_info后,页面打印:“学生姓名长度为:2”
jinja2控制语句:
if条件
仍然采用上述例子,把index.html修改为:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>老师信息</title>
</head>
<body>
{% if teacher.age > 60 %}
<div>已达到退休年龄</div>
{% elif teacher == 60 %}
<div>刚达到退休年龄</div>
{% else %}
<div>未达退休年龄</div>
{% endif %}
</body>
</html>
访问:ip:port/teacher_info后,页面打印:“未达退休年龄”
for循环
app.py
@app.route('/book')
def book_info():
books = [
{
"name": "三国演义",
"author": "罗贯中"
}, {
"name": "水浒传",
"author": "施耐庵"
}
]
return render_template("index.html", books=books)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>老师信息</title>
</head>
<body>
{% for book in books %}
<div>图书名称:{{ book.name }},图书作者:{{ book.author }}</div>
{% endfor %}
</body>
</html>
访问:ip:port/book后,页面打印两行:
图书名称:三国演义,图书作者:罗贯中
图书名称:水浒传,图书作者:施耐庵
模板继承
使用{% extends "xxx.html" %}语法来继承
使用{% block xx %}语法来定制继承后的个性化内容
加载静态文件:图片、css、js
静态文件放在static目录下
html文件中,通过Link引入css,通过script引入js,通过img引入图片,通过{{url_for}}引入静态文件
html文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>老师信息</title>
<link rel="stylesheet" href="{{ url_for('static', filename='/css/style.css') }}">
<script src="{{ url_for('static', filename='/js/test.js') }}"></script>
</head>
<body>
<img src="{{ url_for('static', filename='images/linux.png') }}" alt="">
</body>
</html>
css文件
body{
background-color: pink;
}
js文件
alert("我是在js中执行的")
执行效果