Flask_入门
django是个大而全的框架,flask是一个轻量级的框架。
django内部为我们提供了非常多的组件:orm / session / cookie / admin / form / modelform / 路由 / 视图 / 模板 / 中间件 / 分页 / auth / contenttype / 缓存 / 信号 / 多数据库连接
flask框架本身没有太多的功能:路由/视图/模板(jinja2)/session/中间件 ,第三方组件非常齐全。
注意:django的请求处理是逐一封装和传递; flask的请求是利用上下文管理来实现的。
安装
pip3 install flask #会自动安装依赖
1. 依赖wsgi Werkzeug
from werkzeug.serving import run_simple
def func(environ, start_response):
print('请求来了')
pass
if __name__ == '__main__':
run_simple('127.0.0.1', 5000, func)
from werkzeug.serving import run_simple
class Flask(object):
def __call__(self,environ, start_response):
return "xx"
app = Flask()
if __name__ == '__main__':
run_simple('127.0.0.1', 5000, app)
from werkzeug.serving import run_simple
class Flask(object):
def __call__(self,environ, start_response):
return "xx"
def run(self):
run_simple('127.0.0.1', 5000, self)
app = Flask()
if __name__ == '__main__':
app.run()
2. 快速使用flask
from flask import Flask
# 创建flask对象
app = Flask(__name__)
@app.route('/index')
def index():
return 'hello world'
@app.route('/login')
def login():
return 'login'
if __name__ == '__main__':
app.run()
总结:
- flask框架是基于werkzeug的wsgi实现,flask自己没有wsgi。
- 用户请求一旦到来,就会之
app.__call__方法 。 - 写flaks标准流程
3.用户登录&用户管理
from flask import Flask,render_template,jsonify,request,redirect,url_for,session
import functools
app = Flask(__name__)
app.secret_key = 'zbbzxy521521!'
DATA_DICT = {
1:{'name':'zbb','age':24},
2:{'name':'zxy','age':18}
}
def auth(func):
@functools.wraps(func)
def inner(*args,**kwargs):
username = session.get('xxx')
if not username:
return redirect(url_for('login'))
return func(*args,**kwargs)
return inner
@app.route('/login',methods=['GET','POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
user = request.form.get('user')
pwd = request.form.get('pwd')
if user == 'zbb' and pwd == 'zxy':
session['xxx'] = 'zbb'
return redirect('/index')
error = "输入哟有误"
return render_template('login.html',error=error)
@app.route('/index',endpoint='idx')
@auth
def index():
data_dict = DATA_DICT
return render_template('index.html',data_dict=data_dict)
@app.route('/edit',methods=['GET','POST'])
@auth
def edit():
nid = request.args.get('nid')
nid = int(nid)
info = DATA_DICT[nid]
if request.method == "GET":
return render_template('edit.html',info=info)
user = request.form.get('name')
pwd = request.form.get('age')
DATA_DICT[nid]['name']=user
DATA_DICT[nid]['age']=pwd
return redirect(url_for('idx'))
@app.route('/del/<int:nid>')
@auth
def delete(nid):
del DATA_DICT[nid]
return redirect(url_for('idx'))
if __name__ == '__main__':
app.run()
edit.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form method="post">
<input type="text" name = 'name' value="{{ info.name }}">
<input type="text" name = age value="{{ info.age }}">
<input type="submit" name = '提交'>>
</form>
</body>
</html>
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>用户列表</h1>
<table border="1">
<thead>
<tr>
<th>id</th>
<th>用户名</th>
<th>年龄</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for key,value in data_dict.items() %}
<tr>
<td>{{ key }}</td>
<td>{{ value.name }}</td>
<td>{{ value.age }}</td>
<td>
<a href="/edit?nid={{key}}">编辑</a>
<a href="/del/{{key}}">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>用户登录</h1>
<form method="post">
<input type="text" name = 'user'>
<input type="text" name = pwd>
<input type="submit" name = '提交'><span style="color: red;">{{ error }}</span>
</form>
</body>
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
</html>
4.总结
1.flask路由
@app.route('/login',methods=['GET','POST'])
def login():
pass
2.路由的参数
@app.route('/login',methods=['GET','POST'],endpoint="login")
def login():
pass
# 注意:endpoint不能重名
3.动态路由
@app.route('/index')
def login():
pass
@app.route('/index/<name>')
def login(name):
pass
@app.route('/index/<int:nid>')
def login(nid):
pass
4.获取提交的数据
from flask import request
@app.route('/index')
def login():
request.args # GET形式传递的参数
request.form # POST形式提交的参数
5.返回数据
@app.route('/index')
def login():
return render_template('模板文件')
return jsonify()
reutrn redirect('/index/') # reutrn redirect(url_for('idx'))
return "...."
6.模板处理
{{ x }}
{% for item in list %}
{{item}}
{% endfor %}
7.session处理
app.secret_key = 'zbbzxy521521!' #设置key
session['xxx'] = 'zbb' #登录功之后添加session
Flask_入门的更多相关文章
- flask_入门教程之一
一.教程涉及开发语言.脚本.框架.数据库等内容 Python + Flask + requests 通过命令安装:pip install flask 二.创建第一个flask脚本 一个最小的 Flas ...
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- Oracle分析函数入门
一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...
- Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数
上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...
- Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数
上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...
- Angular2入门系列教程4-服务
上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...
- wepack+sass+vue 入门教程(三)
十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...
- wepack+sass+vue 入门教程(二)
六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...
随机推荐
- 在eclipse中查找一个类中的方法在其他哪个类中被调用了
选中你所要查看的方法名,ctrl+shift+G就可以查看所有调用过该方法的地方了.在Search视图里面可以查看得到这个样子是可以的,你也可以按Ctrl+H全文检索一下
- Navicat 12 for MySQL最新版激活(注册机)(转)(亲测有效)
Navicat 12 for MySQL最新版激活(注册机)(转)(亲测有效) 一.总结 一句话总结: 1.卸载自己机器上面的Navicat,安装下载的包里面的Navicat安装包,不然可能不行 2. ...
- Flutter移动电商实战 --(8)dio基础_伪造请求头获取数据
在很多时候,后端为了安全都会有一些请求头的限制,只有请求头对了,才能正确返回数据.这虽然限制了一些人恶意请求数据,但是对于我们聪明的程序员来说,就是形同虚设.这篇文章就以极客时间 为例,讲一下通过伪造 ...
- smb服务问题解析,区别红帽6和CentOS7
最近在学习smb服务,哇!简直问题多的不要不要的.因为以前是学习的红帽6的系统,现在用的是CentOs7,所以还是改不了以前的一些配置方式,造成了很多问题.快成地中海了! 我们准备环境: 系统: 服务 ...
- [Java读书笔记] Effective Java(Third Edition) 第 3 章 对于所有对象都通用的方法
第 10 条:覆盖equals时请遵守通用约定 在不覆盖equals方法下,类的每个实例都只与它自身相等. 类的每个实例本质上都是唯一的. 类不需要提供一个”逻辑相等(logical equality ...
- 03 MySQL之数据类型和运算符
01-数据类型 MySQL支持多种数据类型,主要有 数值类型.日期/时间类型和字符串类型. 1.1 整数类型 1.2 浮点数类型和定点数类型 单精度浮点类型(FLOAT)和双精度浮点类型 (DOUBL ...
- Fiddler抓取https设置详解(图文)
本文主要说明了自己在设置fiddler抓取https过程中所遇到的问题及解决步骤,特别是fiddler在设置证书的环节遇到的各种奇葩问题,特此分享! 声明:本文为原创文章,转载请注明来源:https: ...
- 关于XMind软件文件格式的一些思考
1,安装XMind软件,看见可以导入Markdown文件 2,因此新建了测试.md文件,代码格式为左图,显示效果为右图. 3,导入到XMind中显示为下图 4,也就是XMind中子标题对应着Markd ...
- 关于Linux系统打开最大文件数量
今天做压力测试 客户端数据提到2000人,在这个过程中,遇到了分配socket失败的问题提示 errno:24 Too many open files查找资料后发现是Linux系统配置了打开文件的最大 ...
- 【C/C++开发】__stdcall,__cdecl,__fastcall的区别
__stdcall和__cdecl的区别 __stdcall和__cdecl是两种函数名字修饰.(注意是连续的两个下划线) Windows上 windows上不管是C还是C++,默认使用的都是__st ...