1.web框架
web后端:
Web框架:
vue,jquery,bootstrap
flask:
django:
tornado:
flask:
方向:
1. mtv 带模板html 模版语言
2. 前后端分离 只负责写接口 api
REST: get post put patch delete
搭建框架:
1.要有虚拟环境:
linux: virtualenv virtualenvwrapper
配置文件的修改: .Envs
.bashrc
...
windows:pip install virtualenvwrapper-win
mkvirutalenv mytest1 新建虚拟环境
workon 虚拟环境名
deactivate 退出虚拟环境
rmvirutalenv 虚拟环境名
2. 新建虚拟环境:
将项目切换到虚拟环境上
点击终端:(flaskenv) C:\Users\running\Desktop\GPDay41\代码\day41_flask>
说明进入到虚拟环境中....
2.Flask框架
from flask import Flask
import settings
app = Flask(__name__)
# 根据配置文件设置
app.config.from_object(settings)
# 装饰器 路由 URL http://127.0.0.1:5000/
@app.route('/')
def index(): # 视图函数 mtv: view 视图 函数
return '大家好!哈哈哈哈哈'
def deal():
return ''
# WSGI: Python Web Server Gateway Interface 是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口
# flask 内置服务器
if __name__ == '__main__':
# host 设置为'0.0.0.0' 可以让外界访问 debug=True----当代吗改变时自动加载,默认关闭
app.run(host='0.0.0.0', port=5000, debug=True) # 设置端口号最好在启动之前设置
3.flask环境搭建
from flask import Flask
import settings
app = Flask(__name__)
app.config.from_object(settings)
# 多个路由
@app.route('/')
def hello_world1():
return 'Hello World111111!'
@app.route('/index')
def hello_world2():
return 'Hello World222222!'
@app.route('/test')
def hello_world3():
return '<font color="red"> Hello World333333! </font>'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000)
3
app= Flask(__name__)
1.关联服务器并启动
app.run(host='',port=5000)
在终端: python app.py
2. app.route('/') 注册路由
def func():
return .....
4.配置
# 配置文件
ENV = 'development'
DEBUG = True
配置:
Environment: production
production ----》 正在
development ---》开发
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
debug mode:on
run(deubg=True) ----> mode:on
on的模式: 代码有改变则服务器重启(重新加载程序)
5.导入配置文件
在app启动前引入文件(两种):
1. app.config.from_object(settings)
2. app.config.from_pyfile('settings.py')
flask是基于Werkzeug工具包的一个web服务框架,所以flask里视图函数的实现,实际上是对werkzeug的一层封装
路由结合视图函数
@app.route('/')
def hello_world(): # ---->视图函数
return 'HELLO hello world!hello kitty!'
#endpoint 相当于起了个别名
@app.route('/abc',endpoint='abc1')
def show_abc():
return '<h1>abc</h1>'
# route就是将函数与add_url_rule进行了装饰
def show_name():
return '千锋教育'
app.add_url_rule('/name', view_func=show_name)
路径(路由)的变量规则:
转换器:
str 默认
int 整型
float 浮点型
path 类似str,但是可以识别'/'
uuid 识别uuid类型的字符串
@app.route('/news/<int:num>') ----><int:num>表示的就是一个变量
# url_for:反向解析
@app.route('rule',endpoint='value')
def func():
pass
url_for('endpoint') -----------> 根据endpoint找到路由rule
6.请求和响应
请求request,响应response
请求:request
from flask import request
client 发出的请求
request对象 只要有请求则会产生一个request对象
request.method 获取请求的方式
request.args.get('key',默认值) ----> get
request.form.get('key',默认值) ----> post
request.values ----> [dictA,dictB] dictA---GET dictB--POST
request.get_json() application/json 类型数据
request.get_data() 将数据构成一个字节字符串
request.remote_addr 获取远程的ip地址
print(request.path) # /
print(request.full_path) # /?name=admin
print(request.url) # http://127.0.0.1:5000/?name=admin
print(request.base_url) # http://127.0.0.1:5000/
print(request.url_root)
print(request.method) # 'GET'
print(request.query_string) # b'name=admin'
响应:response
在视图函数的返回值后面可以跟:
1.string 系统会自动将str转成一个response对象
2.make_reponse( ) 构建response对象,可以给response对象添加一些头部信息
3.jsonify(datas) 将datas转成json的格式 dict默认使用此函数
4.render_template()
5.redirect()
注:make_response()
注意:make_response 想要返回页面,不能直接写做:make_response('hello.html'),必须用render_template('hello.html')形式。
例一:
@blue.route('/makeresponse/')
def make_response_function():
response = make_response('<h2>羞羞哒</h2>')
return response, 404
例二:
@blue.route('/makeresponse/')
def make_response_function():
temp = render_template('hello.html')
response = make_response(temp)
return response
返回状态码的方式: 1》 response = make_response(temp, 200)
2》 return response, 200
8.web中状态码
1.web中的请求状态码:
201创建或更新数据成功
204删除数据成功
301永久重定向,多次发请求时,直接进入定向后的网址,相当于一次请求
302临时重定向,一次请求时,请求完后,进入定向的网址,相当于两次请求303表示对post请求进行重定向
307表示对get请求进行重定向
400 前端请求错误401 用户未进行登录认证
403 无访问权限
404请求未找到
405 请求方式不允许406 服务器无法返回请求制定的accept字段格式。
503 服务异常,可能是服务器负载过重
507 服务器存储错误
- 请求方式post,get,head,options,put,delete区别
get请求方式一般用于查询数据。
post请求一般用于表单或json数据更改,安全性更高。可以在请求体中增加一些数据。put 一般用于更新数据
delete请求用于删除数据
options 查询信息,查询服务端的支持的请求方式。
9.路由
# @router() 与 add_url_rule(rule, endpoint, f, **options)
from flask import Flask
route:
def route(self, rule, **options):
def decorator(f):
self.add_url_rule(rule, endpoint, f, **options)
return f
return decorator
@app.route('/index')
def index():
return 'welcome everyone!'
# 这个装饰器其实就是将rule字符串跟视图函数进行了绑定,通过add_url_rule()实现的绑定
# 等效的
def index():
return 'welcome everyone!'
app.add_url_rule('/index', view_func=index)
2.路由的变量规则:
string (缺省值) 接受任何不包含斜杠的文本 *
int 接受正整数 *
float 接受正浮点数
path 类似 string ,但可以包含斜杠
uuid 接受 UUID 字符串
# 字符串类型不可自定,是默认的,而其他类型必须自定
@app.route('/add/<int:num>')
def add(num):
print('--->', type(num))
result = num + 10
return str(result)
@app.route('/add1/<float:money>')
def add1(money):
print('====>', type(money))
return str(money)
@app.route('/index/<path:p>')
def get_path(p):
print('******>', type(p)) # str类型
print(p)
return p
@app.route('/test/<uuid:uid>') # 必须传递uuid的格式,uuid模块, uuid.uuid4() ---->UUID类型
def test(uid):
print('#######>>>>>', type(uid))
return '获取唯一的标识码'
注意:uuid类型----------
import uuid
uid = uuid.uuid4()
print(uid)
print(type(uid))
uid1 = str(uid)
print(type(uid1))
uid1 = uid1.replace('-','')
print(uid1)
10.有参数的路由
@app.route('/getcity/<key>') # key就是一个变量名,默认是字符串类型的
def get_city(key): # 参数是必须添加的
print(type(key))
return data.get(key)
11.视图函数
#类型一:
@app.route('/index')
def index():
return {
'a': '<h1>北京</h1>', 'b': '上海', 'c': '深圳'} # application/json,标签内容原样显示
#类型二:
@app.route('/index1')
def index1():
return '<h1>北京</h1>'
#类型三:
@app.route('/index2')
def index2():
# ValueError: not enough values to unpack (expected 2, got 1)
# return ('beijing', 'shanghai', 'shenzhen')
return ('beijing',200)
#类型四:
@app.route('/index3')
def index3():
return Response('<h1>大家想好中午吃什么了吗?</h1>') # 返回的Response对象
# 返回值: # Content-Type:text/html; charset=utf-8
# return 后面返回的字符串其实也是做了一个response对象的封装。最终的返回结果还是response对象
# return 的返回值可以是:string dict pulple response对象 WSGI
# 必须要有返回值,不能为None
返回值总结:
1.str
2.dict
3.Response
4.render_template()
5.redirect()
6.make_response()
12.路由路径
# 所有的路由搜索规则都是自上而下搜索,在写路由的是有定义的路由是唯一的。
# 路由中定义'/',无论请求的URL是否带有/,都可以执行视图函数。如果请求的是有/,浏览器做了一次重定向
@app.route('/projects/')
def projects():
return 'The project page'
@app.route('/projects') # 请求路由中如果添加了/ http://127.0.0.1:5000/projects/ 显示Not Found
def about():
return 'The about page'
# 不建议带/,我们希望请求路径是惟一的,
# 以上面这种方式写,第二个将永远不会执行
13.渲染模板
# render_template 渲染模板,就是将h5文件转换为字符串,<class 'str'>
@app.route('/register')
def register():
r = render_template('register.html') # 默认去模板文件夹中找文件夹的,怎么就知道文件夹就是templates?
# print(r)
return r
# 注意:一个pycharm的bug,h5文件写了,但显示不出来,报错,需要重启或重新创建h5文件
14.get 与 post
@app.route('/register2', methods=['GET', 'POST'])
def register2(): # 获取页面提交的内容
print(request.full_path) # /register2?username=zhangsan&address=Beijing
print(request.path) # /register2
print(request.args) # dict类型 d = {'a':'aaa','b':'7878'} d.get('b') 只能取到get请求的
# print(request.args.get('username')) # 获取值
# print(request.args.get('address'))
print(request.form) # 如果请求方法是post则需要通过request.form取值
print(request.form.get('username'))
print(request.form.get('address'))
return '进来了'
15.重定向
redirect()
返回值为response对象,Supported codes are 301, 302, 303, 305, 307, and 308。300 is not supported
作用:redirects the client to the target location
参数:(location, code=302, Response=None)
工作过程:1.向浏览器返回 状态码和location
2.浏览器接收到状态码后,重定向后请求location地址,服务器响应请求地址
url_for('地址别名')
作用:反向解析(通过别名解析地址),返回一个地址
可以写为:
return redirect(url_for('地址别名'))
16.模板-1
render_template(template_name_or_list, **context) 渲染模板
模板:(网页)
模板的语法:
1. 在模板中获取view中传递的变量值:{
{
变量名key }}
2. 向模板传递参数: render_template('模板名字',key=value,key=value)
@app.route('/show')
def show():
name = '沈凯' # str
age = 18 # int
friends = ['建义', '陈璟', '小岳岳', '郭麒麟'] # list
dict1 = {
'gift': '大手镯', 'gift1': '鲜花'