python-flask(一)

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过程

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章