框架:对于同一类型的项目共性代码的封装,称为框架。
Flask 是python开发编写的web框架,相较其他框架,Flask更加的轻量,灵活,但是对python代码能力要求高,Flask只提供了最基本web功能,其他功能都需要开发者自己使用python代码实现,所以,Flask项目质量是由开发者的能力决定的,但是,随着版本迭代,好多社区,组织,三方开发出了公共的Flask插件,开发者不再需要编写好多功能,转为,下载,安装使用三方插件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WH4GM6YL-1605959492028)(G:\Python\typora\图片\image-20201121111259218.png)]
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)]
配置pycharm
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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 "hello world
"
@app.route("/hello") #装饰器,用来指定路由
def hello():
return "hello world
"
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
编写视图函数
视图函数:一个实现功能的函数,它接收Web请求并返回Web响应
启动web服务器,实质上就是在服务器指定目录下,启动服务,将这个目录作为根目录按照http协议规则解析给用户。
app.run() # 启动服务器
host:设置服务器的ip
port:服务器的端口
debug:调试模式
执行的步骤
在web开发当中,可以通过路由修改查询的内容,因为路由本身就可以把接收的数据当中的一部分传递给视图函数。
@app.route("/hello//")
def hello(name):
result = "hello world,I am {}
".format(name)
return result
@app.route("/say_hello/")
def say_hello():
result = """
"""
return result
路由给实际上给参数的类型也做了划分
类型 | 描述 |
---|---|
string | 匹配字符串内容,也是默认类型 |
int | 匹配整数类型 |
float | 匹配小数类型 |
path | 匹配路径 |
@app.route("/hello//")
def hello(name):
result_dict = {
"老王": {"like": "吃"},
"老李": {"like": "喝"},
"老张": {"like": "睡"},
"老赵": {"like": "跑"},
}
like = result_dict.get(name)
if like:
like = like.get("like")
result = "{} 的爱好是 {}
".format(name,like)
return result
jinjia2模板技术来源与django的模板技术,但目前发展超过了django的模板系统。
jinjia2 负责以下任务:
在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
)
就是将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的语法,可以实现加强的效果
Title
{
{ name_list }}
{% for i in name_list %}
- {
{ i }}
{% endfor %}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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())
前端部分
Title
书名
作者
出版社
类型
{% for book in books %}
{
{ book.book_name }}
{
{ book.author }}
{
{ book.public }}
{
{ book.book_type }}
{% endfor %}
后端部分
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
)