Flask介绍
框架:对于同一类型的项目共性代码的封装,称为框架。
Flask 是python开发编写的web框架,相较其他框架,Flask更加的轻量,灵活,但是对python代码能力要求高,Flask只提供了最基本web功能,其他功能都需要开发者自己使用python代码实现,所以,Flask项目质量是由开发者的能力决定的,但是,随着版本迭代,好多社区,组织,三方开发出了公共的Flask插件,开发者不再需要编写好多功能,转为,下载,安装使用三方插件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WH4GM6YL-1605959492028)(G:\Python\typora\图片\image-20201121111259218.png)]
Flask的开始
下载
python=3.7 python的版本
flask=1.1.1 flask的版本
-
打开cmd
国内镜像源的地址: 清华大学:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 豆瓣:http://pypi.douban.com/simple/
pip install flask=1.1.1 -i https://pypi.tuna.tsinghua.edu.cn/simple # 使用清华源
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7y1q4swU-1605959492031)(G:\Python\typora\图片\image-20201121111751361.png)]
使用flask编写helloword
-
配置pycharm
- 选择file里面的setting,下面的project:项目名,Project Interpreter
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-46HnGG88-1605959492033)(G:\Python\typora\图片\image-20201121111956698.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NS8s0mzZ-1605959492036)(G:\Python\typora\图片\image-20201121112230875.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ndHmyA6r-1605959492038)(G:\Python\typora\图片\image-20201121112258022.png)]
- 找到自己创建的沙箱环境的python解释器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mBNqfjLX-1605959492040)(G:\Python\typora\图片\image-20201121112342200.png)]
-
编写代码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NWk3XxS9-1605959492041)(G:\Python\typora\图片\image-20201121112705682.png)]
-
flask实现的原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-56BCFlhY-1605959492043)(G:\Python\typora\图片\image-20201121112750327.png)]
-
代码解析
main.py
from flask import Flask app = Flask(__name__) #创建web服务器实例 #__name__: 内置的python方法,用来标识python文件的执行状态 #直接执行当前文件 __name__ = '__main__' #被导入执行 __name__ = "文件的相对路径" #执行的优先级 #用户通过url来告诉浏览器取哪里获取资源,url(统一资源定位符) @app.route("/index") #装饰器,用来指定路由 ,基于当前web服务器实例创建路由和对应的视图 def index(): #视图函数 return "<p style= 'color: red'>hello world</p>" @app.route("/hello") #装饰器,用来指定路由 def hello(): return "<h1 style= 'color: red'>hello world</h1>" if __name__ == '__main__': #通常网站的页面需要放到服务器上,用户无法直接双击打开页面, #所以有网站服务器的概念: # apache(比较老,比较成熟web服务器 LAMP(Linux Apache Mysql PHP)) # nginx (比较新,比较成熟web服务器 LNMP(Linux nginx Mysql PHP)) # python自带轻量级web服务器,在学习之初直接使用。 # app.run() #启动服务器 app.run(host="10.10.18.74",port=8000,debug=True) #host 主机 #post 端口 #debug 调试
-
代码编写的步骤
-
导入flask模块:form flask import Flask
-
创建一个服务器实例:app = Flask(_name_)
-
指定路由:@app.route("/路由")
-
路由:是指向视图函数的的标志,用户通过url访问,服务器会从url中获取路由.
-
url(统一资源定位符):比如:https://image1.ljcdn.com/usercenter/images/uc_ehr_avatar/92479a95-3fcb-479c-acfa-643b2b147e53.jpg.120x160.jpg
- 协议头: https://
- 主机部分: image1.ljcdn.com(也可以是一个ip:端口地址如:127.0.0.1:8000)
- 端口:每个ip都有0-65535给端口,前1000个用于系统服务,比如:http协议是80端口,https协议是443,mysql:3306,每个ip的对应端口同时支持一个服务.
- 路由部分:
- 代表资源在这个服务器的位置
- 对于视图函数,代表视图函数的路由
- 对于静态资源代表放在服务器当前web服务的根目录的位置。
- usercenter/images/uc_ehr_avatar/92479a95-3fcb-479c-acfa-643b2b147e53.jpg.120x160.jpg
- 根目录:网络服务器启动的目录就是根目录
-
-
编写视图函数
视图函数:一个实现功能的函数,它接收Web请求并返回Web响应
-
启动web服务器,实质上就是在服务器指定目录下,启动服务,将这个目录作为根目录按照http协议规则解析给用户。
app.run() # 启动服务器
host:设置服务器的ip
port:服务器的端口
debug:调试模式
-
执行的步骤
- 启动脚本
- 在浏览器上给定url(ip:端口/路由)
-
flask路由操作
在web开发当中,可以通过路由修改查询的内容,因为路由本身就可以把接收的数据当中的一部分传递给视图函数。
@app.route("/hello/<name>/")
def hello(name):
result = "<h1>hello world,I am {}</h1>".format(name)
return result
@app.route("/say_hello/")
def say_hello():
result = """
<ul>
<li><a href="/hello/老王/">老王</a></li>
<li><a href="/hello/老李/">老李</a></li>
<li><a href="/hello/老张/">老张</a></li>
<li><a href="/hello/老赵/">老赵</a></li>
</ul>
"""
return result
- 在路由上,有<>包围的部分,匹配到的内容会作为参数传递给视图函数
- 视图函数需要有和路由<>内名称对应的形参进行参数接收
- 接收到的参数可以在函数内部使用
- 可以通过页面的<a>标签的href属性指向目的路由去跳转页面
路由给实际上给参数的类型也做了划分
类型 | 描述 |
---|---|
string | 匹配字符串内容,也是默认类型 |
int | 匹配整数类型 |
float | 匹配小数类型 |
path | 匹配路径 |
@app.route("/hello/<path:name>/")
def hello(name):
result_dict = {
"老王": {"like": "吃"},
"老李": {"like": "喝"},
"老张": {"like": "睡"},
"老赵": {"like": "跑"},
}
like = result_dict.get(name)
if like:
like = like.get("like")
result = "<h1>{} 的爱好是 {}</h1>".format(name,like)
return result
jimjia2模板技术
jinjia2模板技术来源与django的模板技术,但目前发展超过了django的模板系统。
jinjia2 负责以下任务:
加载HTML
-
在main文件同级目录创建templates目录
-
在目录当中编写HTML文件
-
导入render_template方法
-
使用render_template方法加载HTML文件
-
将加载的内容返回
from flask import Flask from flask import render_template app = Flask(__name__) #web后端把HTML文件认为是模板文件, #Flask 默认查找当前目录下templates目录中的HTML @app.route("/") def index(): return render_template("index.html") if __name__ == '__main__': app.run( host = "0.0.0.0", port = 80, debug = True )
HTML数据渲染
就是将python视图函数中的数据传递到HTML中去
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q0xF0nEQ-1605959492045)(G:\Python\typora\图片\image-20201121191224633.png)]
前端展示的效果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UM2wZAO6-1605959492046)(G:\Python\typora\图片\image-20201121191249222.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PMjgKYnp-1605959492048)(G:\Python\typora\图片\image-20201121192532345.png)]
jinja2不但可以将数据传递到前端页面上,还具备一套完整的前端渲染方法。
总体,jinja2将模板语法分为三类
语法 | 描述 |
---|---|
{{ }} | 变量 |
{% %} | 标签 |
{{ | }} | 过滤器 |
变量可以接收视图函数传递过来的对象,并且调用他们的方法
标签具备一部分python的语法,可以实现加强的效果
循环 for
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!--
<h1>这个是一个纯粹的HTML</h1>
<h1>{{ name }} {{ age }}</h1>
<h1>{{ project.upper() }}</h1>
<h1>{{ project.split('p') }}</h1>
-->
{{ name_list }}
<ul>
{% for i in name_list %}
<li><a href="{{ i }}">{{ i }}</a></li>
{% endfor %}
</ul>
</body>
</html>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9D4P9M5i-1605959492050)(G:\Python\typora\图片\image-20201121194314343.png)]
@app.route("/book_list/")
def book_list():
book_list = [
{"book_name": "", "book_type": "", "author": "", "public":""},
{"book_name": "", "book_type": "", "author": "", "public": ""},
{"book_name": "", "book_type": "", "author": "", "public": ""},
{"book_name": "", "book_type": "", "author": "", "public": ""},
{"book_name": "", "book_type": "", "author": "", "public": ""},
]
return render_template("index.html",**locals())
图书案例
-
前端部分
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <table width="700px"> <tr> <th>书名</th> <th>作者</th> <th>出版社</th> <th>类型</th> </tr> {% for book in books %} <tr align="center" height="30px"> <td>{{ book.book_name }}</td> <td>{{ book.author }}</td> <td>{{ book.public }}</td> <td>{{ book.book_type }}</td> </tr> {% endfor %} </table> </body> </html>
-
后端部分
from flask import Flask from flask import render_template app = Flask(__name__) @app.route("/book_list/") def book_list(): books = [ {"book_name": "《西游记》", "book_type": "必读", "author": "朋朋", "public":"延边出版社"}, {"book_name": "《奥特曼大战小矮人》", "book_type": "选读", "author": "森森", "public": "新华出版社"}, {"book_name": "《卖火柴的葫芦娃》", "book_type": "必读", "author": "迅迅", "public": "西安交大出版社"}, {"book_name": "《天线宝宝》", "book_type": "选读", "author": "安安", "public": "清华大学出版社"}, {"book_name": "《桃花怪大战菊花侠》", "book_type": "必读", "author": "框框", "public": "中公出版社"} ] return render_template("book_list.html",**locals()) if __name__ == '__main__': app.run( host = "0.0.0.0", port = 80, debug = True )