首页 > 其他分享 >Flask框架1

Flask框架1

时间:2023-03-31 21:12:46浏览次数:39  
标签:__ return name 框架 Flask app login route

今日内容概要

  • flask和其他python web框架介绍
  • flask快速使用
  • 登陆 显示用户信息小案例
  • 配置文件方式
  • 路由系统

今日内容概要

flask和其他python web框架介绍

python web框架的本质都一样
1.同步框架
	django 大而全 内置的app多 第三方app也多
	flask 小而精 没有过多的内置组件 值完成web框架最基本的功能 需要借助于第三方来完成更加丰富的功能
	web.py 是一个小巧灵活的python框架 它简单且功能强大 但国内很少使用
2.异步框架
	fastapi python的异步web框架 不少公司在使用 https://fastapi.tiangolo.com/zh/
	sanic Python的异步web框架 供支持异步高并发请求的web服务
	tornado 异步框架 用到比较少了

同步框架和异步框架的区别
	同步框架的意思:一个线程只处理一个请求
	异步框架的意思:一个线程可以处理多个请求
	异步框架可以很显著的提高并发量

django在3.x后就支持异步了 所以即是同步框架也是异步框架

flask介绍

flask是一个基于python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架
	jinja2 模板语法 和django的dtl非常的像 但是比它强大
	Werkzeug WSGI 符合wsgi协议的web服务器 django中使用的wsgiref

小案例:wsgiref写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()

使用werkzeug写web
from werkzeug.wrappers import Request, Response


@Request.application
def hello(request):
    return Response('hello word')


if __name__ == '__main__':
    from werkzeug.serving import run_simple
    run_simple('localhost', 4000, hello)

flask快速使用

安装:pip install flask

安装最新的就行 2.x相比1.x虽然源代码动了 但是没有区别

from flask import Flask

# 实例化得到对象 传入一个任意字符串
app = Flask(__name__)


# 通过装饰器注册路由
@app.route('/')
def home():
    return 'hello word'


if __name__ == '__main__':
    # 启动 不传参数默认127.0.0.1 5000端口
    app.run()
    

登陆 显示用户小案例

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>
    <p><input type="submit" value="登陆"></p>{{error}}
</form>
</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>

detail.html

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


</body>
</html>
from flask import Flask, render_template, request, session, redirect, jsonify

# 实例化得到对象 传入一个任意字符串
app = Flask(__name__)

app.debug = True
app.secret_key = 'woefosngajsoidfjajwenfa'

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


# 通过装饰器注册路由
@app.route('/home')
def home():
    if not session.get('user'):
        return redirect('/login')
    return render_template('home.html', user_dict=USERS)

# 添加转换器 可以接受参数
@app.route('/detail/<int:pk>')
# 路由中转换器名是啥就接收啥
def detail(pk):
    # session中没有user说明没登陆 直接跳转到登陆界面
    if not session.get('user'):
        return redirect('/login')
    user = USERS.get(pk)
    return render_template('detail.html', user=user)

# 既可以通过传methods参数可以指定接受哪些请求
@app.route('/login', methods=['get', 'post'])
def login():
    # request对象需要导入  post请求再进行逻辑判断
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        if username == 'lzj' and password == '123':
            # 验证通过 存入session中 是模块 需要导入
            session['user'] = username
            return redirect('/home')
        # 前后端混合 可以直接以位置参数的形式将页面需要的参数传递给页面
        return render_template('login.html', error='用户名或密码错误')
    return render_template('login.html')


@app.route('/test')
def test():
    # 返回json格式 只能传字典和列表
    return jsonify([{'name':'lzj','age':19}])


if __name__ == '__main__':
    # 启动
    app.run()


'''
总结
	1.注册路由
		app.route(路径,methods=[请求方式1,请求方式2])
	2.新手四件套
		render_template  返回页面 并且可以传值 和django有区别
		redirect		重定向
		return 字符串 		直接返回字符串
		jsonify			返回json格式
	3.请求的request对象 是全局的 导入使用即可 但是在不同视图函数中并不会混乱 都是自己的
		request.from  请求体中的内容转换成字典放在这
		request.method  请求方式
	4.session是全局的 也是导入使用即可 一定要指定秘钥
		app.secret_key = '秘钥串'
		session[''] = '' 放值
		session.get()   取值
	5.模板的渲染
		兼容django的dtl语法 但更强大 可以加括号 字典也可以通过.values() .items()取值
	6.转换器
		@app.route('/路由/<int:pk>')

'''

配置文件方式

方式一:
	app.debug = True # 调试模式 提示的信息更加详细 修改代码不需要重启 会自动重启
	app.secret_key = '' # 给session设置秘钥
	该方式只能设置debug和secret_key
方式二:
	app.config['DEBUG'] = True
	app.config['SECRET_KEY'] = ''
	通过app.config设置 是一个字典 key值必须是大写
方式三:
	app.config.from_pyfile('settings.py')
	通过引入设置文件 并且变量名都为大写 不常用
方式四:
	 class BASE(object):
        DEBUG = False

    class ProductionConfig(BASE):
        DATABASE_URI = 'mysql://user@localhost/foo'

    class DevelopmentConfig(BASE):
       DEBUG = True
       DATABASE_URI = 'localhost'
        
	app.config.from_object('DevalopmentConfig')
   app.config.from_object('DevalopmentConfig')
	通过引入类的方式 常用它 无需使用多个py文件管理多套配置
方式五:
	app.config.from_envvar('环境变量名')
	通过环境变量配置
方式六:
	app.config.from_json('json文件名称')
	必须是要是json格式 因为内部会执行json.loads
方式七:
	app.config.from_mapping({'DEBUG':True})
	通过字典的形式 

路由系统

django中配置路由是在urls.py中来实现
flask是基于装饰器的 大部分都是通过装饰器来实现 也可以少部分抽取到py文件中

路由装饰器源码分析
@app.route('/login')
def login():
    pass
本质上就是 index = app.route('/login')(index)
查看route函数
    @setupmethod # 没见过 先不关注 rule就是传进来的/login options是多余的参数
    def route(self, rule: str, **options: t.Any) -> t.Callable[[T_route], T_route]: # rule:str 表示该参数接收字符串类型 ->表示返回的类型 其他同理
        # f就是被装饰的函数 也就是login函数
        def decorator(f: T_route) -> T_route:
            # endpoint我们并没有传 也就是None 先忽略
            endpoint = options.pop("endpoint", None)
            # 真正的添加路由函数 查看源码发现self就是app对象
            self.add_url_rule(rule, endpoint, f, **options)
            return f
        return decorator

查看源码发现真正添加路由的是add_url_rule函数 那么我们也可以手动添加

def home():
    pass

app.add_url_rule('/', endpoint=None, view_func=home, methods=['GET'])
和django的添加路由有点相似

add_url_rule中的参数
	rule			url规则
	view_func		视图函数名
	defaults=None	默认值 当url中不需要参数 但是函数需要时可以使用 defaults={k:v}
	endpoint=None	路由的别名 用于反向解析url
	methods=Node	允许请求的方式 如['GET','POST']
	strict_slashes=None	对url中最后的'/'是否严格要求
	redirect_to=None	重定向到指定的地址

转换器

 'default':          UnicodeConverter,
 'string':           UnicodeConverter,
 'any':              AnyConverter,
 'path':             PathConverter,
 'int':              IntegerConverter,
 'float':            FloatConverter,
 'uuid':             UUIDConverter,

标签:__,return,name,框架,Flask,app,login,route
From: https://www.cnblogs.com/lzjjjj/p/17277467.html

相关文章

  • Spring 框架的事务管理
    1、事务的概念事务是一个不可分隔的工作单元,其中的SQL语句要么全都执行,要么全都不执行,如果有一个失败的话,那么事务就会回滚到最开始的状态,仿佛什么都没发生过一样。在企业级应用程序开发中,事务管理是必不可少的技术,用来确保数据的完整性和一致性。事务的四个特性:ACID......
  • Flask入门
    Flask和pythonweb框架介绍pythonweb框架,本质都一样 -django:大而全,内置的app多,第三方app也多 -flaks:小而精,没有过多的内置组件,值完成web框架最基本的功能,需要借助于第三方,完成更丰富的功能 -web.py:是一个小巧灵活的python框架,它简单而且功能强大(国内几乎没有用......
  • 博客系统——VBLOG_项目工程框架搭建
    VBLOG_项目工程框架搭建一、架构设计采用前后端分离架构设计:api:后端接口服务golang开发的restful接口使用mysql做数据存储web:vue3前端框架前端框架:vue3,vue-routerui组件:arco.design(头条开源组件库)二、接口设计2.1、管理员2.1.1、文章上传接口......
  • scrapy爬虫框架(三)Spider的使用
      在前面已经简单介绍了spider的基础用法,那么今天我们来详细了解一下Spider的具体用法。一、Spider的运行流程  spider是scrapy框架中最核心的组件,其定义了爬取网站的逻辑和解析方式,而spider主要做两件事情:定义爬取网站的动作。分析爬取下来的网页。  那么他的运行流......
  • flask
    今日内容1Flask和pythonweb框架介绍#pythonweb框架,本质都一样 -django:大而全,内置的app多,第三方app也多-Flask:小而精,没有过多的内置组件,只完成web框架最基本的功能,需要借助于第三方,完成更丰富的功能-web.py:是一个小巧灵活的Python框架,它简单而且功能强大(国内几......
  • uni-app框架
    1.uni-app简介uni-app 是一个使用vue的语法+微信小程序的标签和API的跨平台前端框架,开发者编写一套代码,可编译到iOS、Android、H5、小程序等多个平台,几乎覆盖所有流量端,uni-app具有跨端数量更多、性能体验更优秀、学习成本低、开发成本低等几大关键优势。2.使用uni-app的......
  • MyBatis 框架的多表查询的实现
    1、表与表的联系类型一对一(1:1)一对多(1:n或n:1)多对多(n:m)2、Mybatis中实现多表查询的重要标签resultMap在Mybatis框架中,resultMap标签可以表示两个表之间的一对多和一对一关系。如:一个系可以有多个学生,如果想查询每个系的学生信息时,可以在Depar......
  • 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......
  • 前端React框架和jsx语法的编码规范
    基本规则(BasicRules)每个文件只包含一个React组件然而,在一个文件里包含多个没有state或纯组件是允许的。eslint:react/no-multi-comp.经常用JSX语法。不要用React.createElement,除非你从一个非JSX文件中初始化app。ClassvsReact.createClassvsstateless......
  • MyBatis 框架的常用优化方法
    优化1:单独使用MyBatis时,可以封装一个用来获取MyBatis中Session的工具类(1)工具类MybatisUtil将Mybatis框架中的Session对象的获取和关闭封装成一个类;(2)UserDaoImpl中,改为对MybatisUtil类的调用。 优化2:将连接字符串写入配置文件(1)阅读database.prop......