python web
web后端:与数据库进行交互以处理相应的业务逻辑。需要考虑的是如何实现功能、数据的存取、平台的稳定性与性能等
Web框架:用于进行Web开发的一套软件架构
前端框架:vue,jquery,bootstrap
python后端框架三种:Python Web框架大致分成三类,分别是Full-Stack Web框架、Non Full-Stack Web框架、Asynchronous 异步框架。
flask:Non Full-Stack Web框架代表,是一个轻量级的Web Framework 小巧、灵活,它的很多功能需要开发者以插件的形式向里安装,你也可以自己定制
django:Full-Stack Web框架的代表,功能非常全面和成熟,开发文档很完备。
tornado: Non Full-Stack Web框架 I/O性能吞吐高并发
创建环境
搭建框架:
1.要有虚拟环境:
linux: virtualenv virtualenvwrapper
配置文件的修改: .Envs
.bashrc
…
windows:pip install virtualenvwrapper-win
mkvirutalenv mytest1 (新建虚拟环境)
workon 查看已创建的虚拟环境(想切换的话,在后面跟上环境名)
deactivate 退出虚拟环境
rmvirutalenv 虚拟环境名
新建虚拟环境:
默认放在:C:\用户\lenovo\Envs (路径最好不要出现中文)
想修改的话:修改环境变量,在系统变量中新建 变量名:WORKON_HOME 变量值:自己定(如:C:\Envs)
新建:mkvirtualenv flaskenv
(flaskenv) C:\Users\running\Desktop\GPDay41\代码\day41_flask>
说明进入到虚拟环境中…
安装flask:
pip install flask
pip list (查看已安装的库)
打开pycharm-settings-Project Interptrter 将环境改为我们刚创建的虚拟环境
flask框架搭建:
static:静态文件夹 里面存放网页图片
template:模板文件夹 存放所有HTML网页
创建app.py:
from flask import Flask
ctrl+点击Flask可以查看源码:Flask是一个对象
WSGI:WSGI协议 只有python有 服务器就一个 框架有多个 遵循WSGI进行部署 web服务器调用WSGI协议调用应用程序框架的。
静态资源:例如HTML文件,图片文件,css,js文件
动态页面:例如登录页面,查询页面,注册页面等与用户交互的
app= Flask(__name__) #__name__当前文件名字
app相当于一个中心,其他东西围绕它运转
1.关联服务器并启动
app.run(host=‘0.0.0.0’,port=5000) #host默认127.0.0.0本机可以访问 0.0.0.0任何可以访问 端口号默认5000
在终端: python app.py 运行
浏览器里访问:127.0.0.0:5000 没有东西 因为没有定义路由,没有东西供你访问
2. @app.route(’/’) 注册路由
def func():
return …
@app.route('/')
def hello_world():
return 'HELLO hello world'
现在可以在浏览器访问了 127.0.0.0:5000实际上会127.0.0.0:5000/自动加上/表示根路由
配置:
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
run(deubg=True) ---->debug mode:on
on的模式: 代码有改变则服务器自动重启(重新加载程序)不需要我们手动调试
解耦:
settings.py:
ENV = ‘development’
DEBUG = True
在app启动前引入文件(两种):
1. app.config.from_object(settings)
2. app.config.from_pyfile(‘settings.py’)
二部分:
路由和请求request,响应response
flask是基于Werkzeug工具包的一个web服务框架,所以flask里视图函数的实现,实际上是对werkzeug的一层封装
路由结合视图函数
@app.route(’/’)
def hello_world(): # ---->视图函数
return ‘HELLO hello world!hello kitty!’
@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表示的就是一个变量
products = [{'name': 'huawei p30', 'price': '5999', 'color': '黑色'},
{'name': 'mi mate30', 'price': '3999', 'color': '红色'}, {
'name': 'iphone 11', 'price': '10999', 'color': '黑色'}]
@app.route('/product/<name>')
def get_product(name):
for product in products:
value = product.get('name')
if name in value:
return product
@app.route('/product/<int:page>')
def show_product(page):
print(type(page)) # <class 'int'>
return '当前请求的是第' + str(page) + '页数据!'
@app.route('/product/<float:price>') # http://127.0.0.1:5000/product/2.9
def show_product2(price): # price=2.9
print(type(price)) # <class 'int'>
return '当前商品的价格是:' + str(price)
@app.route('/product/<path:pp>')
def show_path(pp):
print(type(pp))
return '得到的是:' + pp
#http://127.0.0.1/product/aa/bb/cc 得到的是aa/bb/cc
import uuid
@app.route('/product')
def show_uuid():
uid=uuid.uuid4() #用户唯一标识
print(type(uid))
return '==>'+str(uid)
进行路由匹配的时候,会根据路由代码的先后顺序进行匹配,uuid应该写在str之前,否则会被str匹配
@app.route(‘rule’,endpoint=‘value’)
定义路由时,最后面可以不加’/’,然后输入网址时加上’/‘就进不去,保持URL的唯一性,而如果定义时加上’’,输入网址时加不加’/’,都能进去,因为不加’'网站会自动加上。
URL构建:
@app.route(‘rule’,endpoint=‘value’)
def func():
pass
url_for(‘endpoint’) -----------> 根据endpoint找到路由rule
endpoint不写,默认是函数名:hello_world
请求:request
from flask import request
client 发出的请求
request对象 只要有请求则会产生一个request对象
@app.route('/')
def hello_world():
print(request) # <Request 'http://127.0.0.1:5000/?name=admin' [GET]>
@app.route('/login', methods=['GET', 'POST'])
def user_login():
print(request.remote_addr)
if request.remote_addr in black_list:
return '哈哈哈你什么都看不到啦'
# request.method 获取请求的方式
if request.method == 'GET':
print(request.args.get('a')) # ?a=100&b=99 request.args 字典对象 request.args.get('a') ---->100
return render_template('register.html')
else:
# 获取提交的数据
# print(request.form)
# print(request.values)
username = request.form.get('username')
password = request.form.get('password')
# result = request.get_json()
# result = request.get_data()
# print(result)
return 'username:' + username + ',password:' + password
# return 'POST!'
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 类型数据 ajax请求
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对象
@app.route('/login')
def user_login():
return render_template('login.html')
@app.route('/abc')
def show_abc():
s = '''
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
h1{
color:red;
}
</style>
</head>
<body>
<h1>ABC</h1>
</body>
</html>
'''
# response = make_response(s)
# response.headers['name']='mytest'
# return response
return s
templates或者app=Flask(name,template_folder=‘template’)
在视图函数的返回值后面可以跟:
1.string 系统会自动将str转成一个response对象
2.make_reponse( ) 构建response对象,可以给response对象添加一些头部信息
3.jsonify(datas) 将datas转成json的格式 dict默认使用此函数
4.render_template()
5.redirect()
@app.route('/news')
def show_news():
if not news:
return render_template('404.html')
# return redirect('/notfound')
@app.route('/notfound')
def not_found():
return render_template('404.html')
#redirect过程