首页 > 其他分享 >flask-介绍、配置文件、路由系统

flask-介绍、配置文件、路由系统

时间:2023-04-01 11:34:57浏览次数:56  
标签:__ return name 配置文件 get flask app Flask 路由

1.flask和pythonweb框架介绍

1.1 框架介绍:

django:大而全,内置的app多,第三方app也多
Flask:小而精,没有过多的内置组件,只完成web框架最基本的功能,需要借助于第三方,完成更丰富的功能
web.py:是一个小巧灵活的Python框架,它简单而且功能强大(国内几乎没有用的)
fastapi:python的异步web框架,不少公司再用,https://fastapi.tiangolo.com/zh/
sanic:python的异步web框架,供支持异步高并发请求的 web 服务
tornado:异步框架,用的比较少了

2.同步框架和异步框架的区别
djagno是同步框架还是异步框架,djagno 3.x以后支持异步
同步框架的意思:一个线程只处理一个请求
异步框架的意思:一个线程可以处理多个请求
异步框架可以很显著的提高并发量

1.2 flask介绍

Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。

“微”(micro) 并不表示你需要把整个 Web 应用塞进单个 Python 文件(虽然确实可以 ),也不意味着 Flask 在功能上有所欠缺。微框架中的“微”意味着 Flask 旨在保持核心简单而易于扩展。Flask 不会替你做出太多决策——比如使用何种数据库。而那些 Flask 所选择的——比如使用何种模板引擎——则很容易替换。除此之外的一切都由可由你掌握。如此,Flask 可以与您珠联璧合。

默认情况下,Flask 不包含数据库抽象层、表单验证,或是其它任何已有多种库可以胜任的功能。然而,Flask 支持用扩展来给应用添加这些功能,如同是 Flask 本身实现的一样。众多的扩展提供了数据库集成、表单验证、上传处理、各种各样的开放认证技术等功能。Flask 也许是“微小”的,但它已准备好在需求繁杂的生产环境中投入使用

jinja2:模板语法,django的dtl,非常像
Werkzeug WSGI 符合wsgi协议的web服务器,django使用的是wsgiref

1.3 wsgiref介绍

最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。

如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。

正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口协议来实现这样的服务器软件,让我们专心用Python编写Web业务。这个接口就是WSGI:Web Server Gateway Interface。而wsgiref模块就是python基于wsgi协议开发的服务模块

用wsgiref写web:

#### wsgirf写web
from wsgiref.simple_server import make_server

# mya 就等同于django
def mya(environ, start_response):
    #把environ包装成了request
    print(environ)
    start_response('200 OK', [('Content-Type', 'text/html')])
    if environ.get('PATH_INFO') == '/index':
        with open('index.html','rb') as f:
            data=f.read()

    elif environ.get('PATH_INFO') == '/login':
        with open('login.html', 'rb') as f:
            data = f.read()
    else:
        data=b'<h1>Hello, web!</h1>'
    return [data]  # 做成了response

if __name__ == '__main__':
    myserver = make_server('', 8008, mya)
    print('监听8010')
    myserver.serve_forever()

因为我们什么都没有输入,所以返回的是b'

Hello, web!

'
image

1.4 使用werkzeug写web

@Request.application
def hello(request):
    return Response('Hello World!')

if __name__ == '__main__':
    from werkzeug.serving import run_simple

    run_simple('localhost', 4000, hello)

image

2.flask快速使用

版本:1.x和2.x,没有本质区别
安装:

pip install flask
#  会自动安装依赖:MarkupSafe, Werkzeug, Jinja2

使用:
flask返回字符串直接使用 return 字符串 就可以

from flask import Flask

app = Flask(__name__)
'''自定义一个名字,字符串类型,因为该文件是执行文件,__name__就等于__main__'''

@app.route('/index')
def index():
    return 'hello world'

'''返回字符串不需要使用HttpResponse'''
@app.route('/')
def home():
    return 'hello home'

if __name__ == '__main__':
    app.run()

image
image

3.登陆、显示用户信息小案例(前后端混合)

3.1知识点:

1.注册路由:app.route(路径,methods=[请求方式('GET'/'POST')])
2.新手四件套:
render_template:模板渲染,将数据传到前端使用变量名=数据值的方式来传,在前端使用变量名点或变量名.get('key')或变量名['key']的方式来取值
return redirect('路由'):重定向
return '字符串':返回字符串
return jsonify:返回json格式字符串
3.请求request对象是全局的的,直接导入使用,在不同视图函数中不回混乱
request.method表示请求方式
request.form表示将post请求body体的内容转换成了字典
4.session是全局的,直接导入即可,使用前一定要制定秘钥app.secret_key='xxx',秘钥设置复杂即可,没有其他要求
5.模板的渲染:
兼容django的dtl
更强大,字典可以用.get('key'),.key,['key']来取值
6.for循环:
{% for k,v in 后端传过来的字典变量名.items() %}
{{v.get('key')}}
{{v.key}}
{{v['key']}}
{% endfor %}
7.转换器:
@app.route('/detail/int:pk')
def detail(pk):
...

3.2 代码

flaskproject.py:

from flask import Flask, request, render_template, redirect, session, jsonify

app = Flask(__name__)

# 要使用session,必须设置秘钥,秘钥是配置信息,秘钥设置尽量复杂即可
app.secret_key = 'dsjfhu3w4hy32hcsd'

USERS = {
    1: {'name': '张三', 'age': 18, 'gender': '男', 'text': "道路千万条"},
    2: {'name': '李四', 'age': 28, 'gender': '男', 'text': "安全第一条"},
    3: {'name': '王五', 'age': 18, 'gender': '女', 'text': "行车不规范"},
}

@app.route('/login', methods=['GET', 'POST'])
def index():
    if request.method == 'GET':
        # return 'adsfsfdff'
        return render_template('login.html')
    else:
        username = request.form.get('username')
        password = request.form.get('password')
        if username == 'max' and password == '123':
            session['name'] = username
            return redirect('/')
        else:
            return render_template('login.html', error='用户名或密码错误')

@app.route('/')
def home():
    if session.get('name'):
        return render_template('home.html', user_dict=USERS)
    else:
        return redirect('/login')


@app.route('/detail/<int:pk>')
def detail(pk):
    if session.get('name'):
        user_detail = USERS.get(pk)
        return render_template('detail.html', user=user_detail)
    else:
        return redirect('/login')

@app.route('/test')
def test():
    return jsonify({'name': 'jerry', 'age': 18})

if __name__ == '__main__':
    app.run()

detail.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <p>姓名:{{user.name}}</p>
  <p>性别:{{user.gender}}</p>
  <p>年龄:{{user.get('age')}}</p>
  <p>{{user.text}}</p>
</body>
</html>

home.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <h1>用户列表</h1>
  <table>
    {% for k,v in user_dict.items() %}
    <tr>
      <td>{{k}}</td>
      <td>{{v.name}}</td>
      <td>{{v['name']}}</td>
      <td>{{v.get('name')}}</td>
      <td><a href="/detail/{{k}}">查看详情</a></td>
    </tr>
    {% endfor %}
  </table>
</body>
</html>

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form method="post">
    <p>用户名:<input type="text" name="username"></p>
    <p>密码:<input type="password" name="password"></p>
    <input type="submit" value="登录"> {{error}}
</form>
</body>
</html>

标签:__,return,name,配置文件,get,flask,app,Flask,路由
From: https://www.cnblogs.com/ERROR404Notfound/p/17278307.html

相关文章

  • 项目一众筹网05_02_[树形开发]菜单管理、API文档发布到web服务器、配置文件里面修改to
    系列文章目录文章目录系列文章目录08-页面显示树形结构-前端-使用真实数据09-准备zTree的API文档(因为现在没有图标)==API文档发布到web服务器上去==配置文件里面修改tomcat的默认端口号(只需改动3个地方)10-前端-显示图标-分析思路(-页面显示树形结构)11-前端-显示图标-代码实现(-页面......
  • Flask快速入门day 01(flask介绍、快速使用、配置文件、路由系统)
    目录Flask框架前言:一、flask介绍1、介绍2、使用两种协议编写web二、flask快速使用1、快速使用:2、使用flask编写登录小案例2.1login.html2.2home.html2.3detail.html2.4py文件三、flask配置文件1、配置文件的几种方式方式一:直接编写方式二:使用app.config方式三:使用py文件,然后......
  • Flask框架1
    今日内容概要flask和其他pythonweb框架介绍flask快速使用登陆显示用户信息小案例配置文件方式路由系统今日内容概要flask和其他pythonweb框架介绍pythonweb框架的本质都一样1.同步框架 django大而全内置的app多第三方app也多 flask小而精没有过多的内置组件......
  • Flask入门
    Flask和pythonweb框架介绍pythonweb框架,本质都一样 -django:大而全,内置的app多,第三方app也多 -flaks:小而精,没有过多的内置组件,值完成web框架最基本的功能,需要借助于第三方,完成更丰富的功能 -web.py:是一个小巧灵活的python框架,它简单而且功能强大(国内几乎没有用......
  • flask
    今日内容1Flask和pythonweb框架介绍#pythonweb框架,本质都一样 -django:大而全,内置的app多,第三方app也多-Flask:小而精,没有过多的内置组件,只完成web框架最基本的功能,需要借助于第三方,完成更丰富的功能-web.py:是一个小巧灵活的Python框架,它简单而且功能强大(国内几......
  • Flask框架 之Flask-login用户登录
    文档:https://flask-login.readthedocs.io/en/latest/安装:pipinstallflask-login一、效果图  二、示例代码fromflaskimportFlask,render_template,url_for,redirect,flashfromflask_loginimportLoginManager,login_required,UserMixin,login_user,lo......
  • 东用科技路由器与H3C Router构建IPSec VPN配置指导手册
    东用科技路由器与H3CRouter构建IPSecVPN配置指导手册一、H3CRouter配置:<H3CRouter>system-view//进入配置模式[H3CRouter]local-useradmin//添加本地用户[H3CRouter-luser-cisco]passwordsimpleadmin//为添加的用户设置密码[H3CRouter-luser-cisco]service-typeweb//开......
  • Flask框架 之使用蓝图实现模块划分
     一、示例代码run.pyfromappimportcreate_appif__name__=='__main__':app=create_app()app.run(debug=True,port=5000)__init__.pyfromflaskimportFlaskfromapp.controllersimportconfig_blueprintdefcreate_app():app=Fla......
  • HCIP-ICT实战进阶11-虚拟路由网关协议VRRP
    HCIP-ICT实战进阶11-虚拟路由网关协议VRRP0回顾链路聚合是为了做什么?通过多条线路实现冗余备份,可以实现N+M备份,同时链路聚合可以提升网络速度.二层环境通过各种生成树协议(多为MSTP)避免环路.在IGP协议中,三层环境可以通过自身算法实现冗余备份比如SPF算法.......
  • shell脚本-巡检华为路由器、交换机板卡状态
    将巡检的设备状态信息文件放到和shell脚本一个目录下,执行bash脚本名称forfilenamein$(ls|grepSD1);do device_model=$(cat$filename|grep"'sDevicestatus"|cut-d"'"-f1) if[[$device_model="NE40E-X8"]];then sysname=$(cat$filen......