一.虚拟环境的简介
1.什么是虚拟环境:存在于系统环境中但独立于外部的一个环境称为虚拟环境。
2.虚拟环境和系统环境的关系:虚拟环境是系统环境中的一个独立的环境,存在于系统环境中,当创建了虚拟环境后,只有进入到虚拟环境中进行pip install 的包才会安装到虚拟环境中,如果是在系统环境中pip install 的包只会存在于系统环境中而会进入到虚拟环境中去。
3.虚拟环境的作用:有多个项目环境时,保证了项目有一个独立安全的环境而不会受其他项目环境的干扰。
注意:日常的实际项目开发中都是通过创建虚拟环境来开发项目的而不会用系统环境
4.创建虚拟环境的方法:
·1 新建一个创建项目的空文件夹及创建一个存放项目虚拟环境位置的文件夹
·2 为计算机配置变量名为WORKON_HOME(该变量名为固定名字),变量值为虚拟环境要安装的路径(例如:F:\flask项目环境)
·3 快捷键windows+R打开cmd命令窗口,执行pip install pipenv
·4 进入项目对应的文件目录下,执行pipenv shell 来创建项目虚拟环境,创建好的项目虚拟环境的位置就是在环境变WORKON_HOME配置的路径目录下
5.操作虚拟环境的相关命令
· 1 pipenv shell的作用:创建虚拟环境或者启动进入虚拟环境
· 2 pipenv --rm的作用: 删除虚拟环境,但不会删除pipfile文件
·3 exit的作用:退出虚拟环境
· 4 pipenv install --dev itchat的作用:指定安装在开发环境下
二 .flask简介
1. flask第一个程序
#先导入包
from flask import FLASK
#进行实例化
app = Flask(__name__)
#创建视图函数
@app.route('/') #将路由映射到函数上从而访问对应路由的时候能调用函数内容
def amk():
return 'hello world'
#主入口
if __name__ == '__main__':
# 在当前本地应用服务器上运行该程序
app.run() # 小括号里不传参数时,url地址就是默认为本机地址:host= 127.0.0.1,端口默认为:port = 5000,若为默认值均可省略不写
运行程序后的结果:
* Serving Flask app "day_1022" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit
在浏览其中输入: http://127.0.0.1:5000/,则会调用视图函数的内容并显示到网页
2 .为程序设置开启debug模式
· 开启debug模式的作用:便于在开发过程中更好的发现问题,有助于更好的开发维护,提高开发维护效率
· 注意:通常开启debug模式是在开发过程中才使用的,当项目完成要上线时必须把debug模式关闭
· 开启debug模式的几种方法:
- 通过 app.debug = True 来开启
from flask import Flask
app = Flask(__name__)
@app.route('/')
def amk():
return 'hello world'
if __name__ == '__main__':
app.debug = True #开启debug模式
app.run()
开启后运行程序后 ,debug mode将显示on,说明debug模式已经开启成功
* Debug mode: on
* Restarting with stat
* Debugger is active!
* Debugger PIN: 315-482-697
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
2.通过在 app.run() 中传入参数debug = True来开启debug模式,一般这种开启方式比较常用
from flask import Flask
app = Flask(__name__)
@app.route('/')
def amk():
return 'hello world'
if __name__ == '__main__':
app.run(debug = True) #开启debug模式
开启后运行程序后 ,debug mode将显示on,说明debug模式已经开启成功
* Debug mode: on
* Restarting with stat
* Debugger is active!
* Debugger PIN: 315-482-697
3.通过app.config.update(DEBUG = True) 来开启debug模式
from flask import Flask
app = Flask(__name__)
@app.route('/')
def amk():
return 'hello world'
if __name__ == '__main__':
app.config.update(DEBUG = True) #开启debug模式
app.run()
开启后运行程序后 ,debug mode将显示on,说明debug模式已经开启成功
* Debug mode: on
* Restarting with stat
* Debugger is active!
* Debugger PIN: 315-482-697
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
4.通过app.config.update(dict(DEBUG = True) 来开启debug模式
from flask import Flask
app = Flask(__name__)
@app.route('/')
def amk():
return 'hello world'
if __name__ == '__main__':
app.config.update(dict(DEBUG = True)) #开启debug模式
app.run()
开启后运行程序,debug mode将显示on,说明debug模式已经开启成功
* Debug mode: on
* Restarting with stat
* Debugger is active!
* Debugger PIN: 315-482-697
5.通过app.config.update({‘DEBUG’:True}) 来开启debug模式
from flask import Flask
app = Flask(__name__)
@app.route('/')
def amk():
return 'hello world'
if __name__ == '__main__':
app.config.update({'DEBUG':True}) #开启debug模式
app.run()
开启后运行程序,debug mode将显示on,说明debug模式已经开启成功
* Debug mode: on
* Restarting with stat
* Debugger is active!
* Debugger PIN: 315-482-697
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
6.通过app.config[‘DEBUG’] = True 来开启debug模式
from flask import Flask
app = Flask(__name__)
@app.route('/')
def amk():
return 'hello world'
if __name__ == '__main__':
app.config['DEBUG'] = True #开启debug模式
app.run()
开启后运行程序,debug mode将显示on,说明debug模式已经开启成功
* Debug mode: on
* Restarting with stat
* Debugger is active!
* Debugger PIN: 315-482-697
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
三. 配置文件
1.配置文件可以为项目配置一些需要的设置,当项目需要配置的地方比较多时,就可以通过导入配置文件的方式为项目程序配置一些功能设置
· 配置文件的优势:当需要修改配置的地方比较多时不需要到处去修改,只需要在配置文件中修改即可全部修改
2. 配置文件的创建和运用
· 创建一个配置文件
· 在配置文件中写入所需要的配置功能的逻辑代码(例如:开启debug模式,设置host,设置报错时的错误码等等)
· 在主程序中导入对应的配置文件
from flask import Flask
import config #导入配置文件
app = Flask(__name__)
@app.route('/')
def amk():
return 'hello world'
if __name__ == '__main__':
app.config['DEBUG'] = True
app.run()
· 运用app.config.from_object()或app.config.from_pyfile()来对项目程序进行配置
1.运用app.config.from_object()来配置,小括号里传入的参数可以为配置文件的模块名,也可以是引号里加配置文件模块名
from flask import Flask
import config #导入配置文件
app = Flask(__name__)
@app.route('/')
def amk():
return 'hello world'
if __name__ == '__main__':
app.config.from_object(config) #为程序添加配置
app.run()
from flask import Flask
import config #导入配置文件
app = Flask(__name__)
@app.route('/')
def amk():
return 'hello world'
if __name__ == '__main__':
app.config.from_object('config') #为程序添加配置
app.run()
输出结果:
* Serving Flask app "day_1022" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
* Restarting with stat
* Debugger is active!
* Debugger PIN: 315-482-697
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
2.运用app.config.from_pyfile()来配置,小括号里传入的参数为配置的文件名,注意文件名记得加引号
from flask import Flask
import config #导入配置文件
app = Flask(__name__)
@app.route('/')
def amk():
return 'hello world'
if __name__ == '__main__':
app.config.from_pyfile('config.py',silent = True) #silent = True 表示当传入的文件名错误或者不存在时,代码行不会报错
app.run()
四. url和视图
1. 使用内置装饰器@app.route来将url与执行函数进行映射,以便调用URL的时候能够执行对应的函数内容
from flask import Flask
app = Flask(__name__)
@app.route('/') #‘/’代表根路由,因此当浏览器输入服务器地址便可直接调用到该视图函数
def amk():
return 'hello world'
if __name__ == '__main__':
app.run()
2. 视图函数:url映射到函数上,这种函数称为视图函数
· 视图函数中url的末尾带 / 与不带 / 是两个完全不一样的url地址,当视图函数中的url 末尾带有 / ,则在浏览器中输入时如果不带 / 也会自动补齐;反之,若视图函数中的url末尾不带有 /,而浏览器中输入时如果末尾输入 /则网页会报错访问不到该视图函数
from flask import Flask
app = Flask(__name__)
@app.route('/article') #必须传入字符串且前面第一个 /必须的写,该url末尾不带 /
def amk():
return 'hello world'
if __name__ == '__main__':
app.run()
from flask import Flask
app = Flask(__name__)
@app.route('/article/') #必须传入字符串且前面第一个 /必须得写,该url末尾有带 /
def amk():
return 'hello world'
if __name__ == '__main__':
app.run()
3. 通过url向视图函数传递参数
- string :默认的数据类型,接受没有任何斜杆的字符串
from flask import Flask
app = Flask(__name__)
@app.route('/article/<string:aid>') #<>是固定写法,当类型默认字符串时类型可以不写,接受没有任何/的字符串
def amk(aid):
return f'hello{aid}'
if __name__ == '__main__':
app.run()
- int :整型
from flask import Flask
app = Flask(__name__)
@app.route('/article/<int:sid>/') #<>是固定写法,允许传入的数据类型为整型
def ssk(sid):
return 'hello xizhong'
if __name__ == '__main__':
app.run(debug = True)
- float :浮点型
from flask import Flask
app = Flask(__name__)
@app.route('/article/<float:sid>/') #<>是固定写法,允许传入的数据类型为浮点型
def ssk(sid):
return 'hello xizhong'
if __name__ == '__main__':
app.run(debug = True)
- pathl类型: 和string类型相似,区别是该类型允许传递斜杆/
from flask import Flask
app = Flask(__name__)
@app.route('/article/<path:sid>/') #<>是固定写法,允许传入的类型为path类型,允许传入/
def ssk(sid):
return 'hello xizhong'
if __name__ == '__main__':
app.run(debug = True)
浏览器中输入url和url参数http://127.0.0.1:5000/article/wux/ddk/后网页显示如下:
- uuid: uuid类型的字符串,指一些加密类型的字符串
- any: 为同一个视图函数指定多种url路径
from flask import Flask
app = Flask(__name__)
@app.route('/<any(article,title,ssek):url_path>/') # #<>是固定写法,可以允许传递多种路径,该视图函数允许传入了article,title,ssek这三个路径,后面url_path也是固定的写法
def ssk(url_path):
return '人生苦短,我用python'
if __name__ == '__main__':
app.run(debug = True)
4.若浏览器想通过?xxx=xxx的方式来传递参数,则视图函数中可通过request.args.get(‘xxx’)来实现,注意如果是POST的请求方式则要通过request.form.get(‘xxx’)来进行获取参数
from flask import Flask,request # 注意记得导入request模块
app = Flask(__name__)
@app.route('/artled/') #不写methods参数默认为GET请求方式
def ssk():
name = request.args.get('ae')
return 'hello world'
if __name__ == '__main__':
app.run(debug = True)
以下通过在浏览其中输入http://127.0.0.1:5000/artled/?ae=123成功访问
五.url_for的使用
- url_for 是用来反转的,通过函数名和参数来获取相应的视图函数的url地址的方法
- url_for的用法: url_for(‘函数名’, 函数的参数,·····) 注意:当视图函数的url没有传入参数时,则后面的函数的参数可不写,url_for 接受两个及以上参数,除了接受第一个和第二个参数外,若后面还有其他参数则会添加到url后面作为查询参数。
from flask import Flask,request,url_for #记得导入url_for
app = Flask(__name__)
@app.route('/artled/<sid>')
def ssk(sid):
return 'hello world'
@app.route('/wcz/')
def snak():
return url_for('ssk',sid=1,name=3,aw=4) # 第二个参数后面的参数都作为查询参数加到url后面
if __name__ == '__main__':
app.run(debug = True)
输出如下:
六. HTTP的请求方法
HTTP的常见请求方法分为GET方法和POST方法两种请求方法,其中GET请求方法为默认的HTTP请求方法,该默认方法一般可以省略不写
1.GET请求方法的使用
from flask import Flask
app = Flask(__name__)
@app.route('/',methods=['GET']) #通过在装饰器@app.route传入列表methods=['GET']来表示HTTP的请求方法,该GET方法为默认方法因此也可以省略不写methods=['GET'],但仍然能够表示GET请求方法
def sfg():
return 'hello python'
if __name__ == '__main__':
app.run(debug = True)
2. POST请求方法的使用
from flask import Flask
app = Flask(__name__)
@app.route('/',methods=['POST']) #通过在装饰器@app.route传入列表methods=['POST']来表示HTTP的POST请求方法,POST请求方法不能通过网页直接访问,只能通过postmain工具才能访问到
def sfg():
return 'hello python'
if __name__ == '__main__':
app.run(debug = True)
- POST请求方法可像如下可使用Postman工具来传递参数并访问
from flask import Flask,request
app = Flask(__name__)
@app.route('/',methods = ['POST']) #POST请求方法
def hello():
name = request.form.get('name')
print(name)
return 'hello python'
if __name__ == '__main__':
app.run(debug = True)
- 运行程序后打开Postman工具如下示:
选择POST,然后输入url地址,然后选择Body-----form-data,在KEY中输入对应的参数名,在VALUE中输入对应的值,然后点击send
在pycharm控制台能看到对应的传递的参数值
* Debugger PIN: 131-008-492
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [04/Nov/2020 00:06:59] "POST / HTTP/1.1" 200 -
machuxian #Postman设置的对应参数值在控制台打印显示
3. 可以通过设置methods = ['GET’,‘POST’]来同时设置即可以GET方法请求,又可以POST方法请求
from flask import Flask
app = Flask(__name__)
@app.route('/',methods=['GET','POST']) #同时设置可以通过GET方法请求,也可以通过POST方法请求
def sfg():
return 'hello python'
if __name__ == '__main__':
app.run(debug = True)
七.页面跳转和重定向
1.网页跳转的定义:从当前网页切换到另一个网页的瞬间即为页面跳转 如下所示:
当点击百度时会从当前主页跳转到百度的页面
2.重定向:从当前的url地址切换到另外一个新的url地址的过程称为重定向
-
重定向分为永久重定向(状态码code= 301)和 临时重定向(状态码code = 302)
-
永久重定向的状态码为code=301,多用于旧网址被废弃了要转到一个新的网址确保能够被用户访问的情况下。
-
临时重定向的状态码为code = 302,一般应用于当用户访问时没有登录时便会自动重定向到登录页面让用户登录成功后再跳转回用户需要访问的页面。
3. 重定向的函数用法: redirect(location,code),其中location表示需要重定向到的url,一般用url_for()来获取url, code表示使用哪个重定向,若code=301表示永久重定向,若code=302表示临时重定向
from flask import Flask,request,url_for,redirect #导入url_for和redirect
app = Flask(__name__)
@app.route('/artled/<sid>')
def ssk(sid):
return 'hello world'
@app.route('/wcz/')
def snak():
return url_for('ssk',sid=1,name=3,aw=4)
@app.route('/lingo/')
def chun_feng():
return redirect(url_for('ssk',sid=1),code = 302) 将当前的url'/lingo/'临时重定向到url'/artled/<sid>'
if __name__ == '__main__':
app.run(debug = True)
八.响应
视图函数可以返回以下数据类型:
- 字符串
from flask import Flask
app = Flask(__name__)
@app.route('/artled/<sid>')
def ssk(sid):
return 'hello world' #返回字符串类型
- 字典
from flask import Flask,request,url_for,redirect,Response,make_response
app = Flask(__name__)
@app.route('/artled/')
def ssk():
return dict(name='chuxian',age=18) #返回字典类型
@app.route('/wcz/')
def snak():
return url_for('ssk',sid=1,name=3,aw=4)
@app.route('/lingo/')
def chun_feng():
return redirect(url_for('ssk',sid=1),code = 302)
if __name__ == '__main__':
app.run(debug = True)
- 元组
from flask import Flask,request,url_for,redirect,Response,make_response
app = Flask(__name__)
@app.route('/lingo/')
def chun_feng():
return 'python',200 #在网页中只会显示第一个参数,第二个参数为状态码
if __name__ == '__main__':
app.run(debug = True,port = 8000)
- Response
from flask import Flask,request,url_for,redirect,Response,make_response
app = Flask(__name__)
@app.route('/lingo/')
def chun_feng():
return Response(response='hello world',status=200,mimetype='html/text') #这里第一个参数为字符串,第二个参数为状态码,第三个参数为允许的文件类型
if __name__ == '__main__':
app.run(debug = True,port = 8000)
- make_response
from flask import Flask,request,url_for,redirect,Response,make_response
app = Flask(__name__)
@app.route('/lingo/')
def chun_feng():
return make_response('hello') 这里传入的参数为字符串
if __name__ == '__main__':
app.run(debug = True,port = 8000)