flask框架
用Python做Web开发的三大框架特点
Django
主要特点是大而全,集成了很多的组件,例如:Admin Form Model等,不管你用不用的到,他都会为
你提供,通常用于大型Web应用,由于内部组件足够强大,所以使用Django可以做到一气呵成,
   Django的优点是大而全,缺点也就露出来,这么多的资源一次性全部加载,肯定会造成cpu资源的浪费 flask
flask原生组件几乎为零,只有底层的jinja2(模板)和Werkzeug(服务器),属于短小精悍型框架,
flask通常用于小型应用和快速构建应用,其强大的第三方库足以支持一个大型项目 Tornado
主要特点是原生异步非阻塞,在IO密集型和多任务处理上占据压倒性的优势,属于专注性框架,通
常用于API后端应用,游戏服务后台,其内部实现的异步非阻塞真的是很稳,优点是异步,缺点是干净,连个session也不支持 什么是flask的框架
web访问流程
web框架
flask简介
创建flask的虚拟环境
windos下用pycharm创建flask的虚拟环境
windows下,直接在user目录中创建一个pip目录,如:C:\Users\xx\pip,新建文件pip.ini
内容如下
 [global]
 index-url = https://pypi.tuna.tsinghua.edu.cn/simple
利用pycharm的优点自动创建虚拟环境 写模板程序
from flask import Flask app = Flask(__name__) @app.route("/")
def index():
return "hello word" if __name__ == "__main__":
app.run(port=9001, debug=True) Flask参数的配置
import_name,           #相当于 __name__/"__main__"
static_path=None,         #静态路径
static_url_path=None,     #规定了哪种类型的url是静态请求
static_folder='static',     #如果是静态请求,去static文件夹找文件
template_folder='templates',  #静态模板,去templates中找模板文件
instance_path=None,      #论坛
instance_relative_config=False #应用程序的配置 加载配置的方式
DEBUG = True 设置为调试模式
app.config.from_object()
从对象中加载
class Config(object):
DEBUG = True
app.config.from_object(Config)
从配置文件中加载
从config.ini文件中加载的内容为
DEBUG = True
app.config.from_object("config.ini")
从环境变量中加载(不推荐使用)
常用配置的参数
app.debug = True
app.config["DEBUG"] = True app.run()的三个参数
host="127.0.0.1"
port=9001
debug = True JSON的数据格式
json中的数据一定要加双引号("")
json中的数据实际就是一种在特定格式下显示的字符串
json中的数据一般是POST请求方式
json常用的方法
json.dump()
json.dumps()   #将字典对象转化为标准格式的json字符串,没有格式化(按照代码中定义的json格式)
json.load()
json.loads() #将json格式的字符串转化为Python对象(字典)
jsonify() #将字典对象转化为标准格式的json字符串,格式化显示
如果JSON数据中有中文,在浏览器显示是unicode编码,需设置如下:
#将默认的ASCII编码屏蔽掉,才能在浏览器中显示当前json数据中的具体内容
app.config["JSON_AS_ASCII"] = False json_data = {
"name": "张三",
"age": 20,
"gender": "男"
} 重定向(redirect)
@app.route("/redirect")
def func_redirect():
#跳转到百度等其他网页
#return redirect("http://www.baidu.com") #跳转到当前路径下的某个文件
return redirect(url_for("要跳转的函数名",是否携带参数)) 提供模板文件(render)
在当前路径中必许有一个文件夹叫templates,其中存放html中的模板代码,否则会有一个
jinja2.exceptions.TenplatesNotFound的错误
@app.route("/home")
def home():
return render_template("/test.html") //直接跳转到test.html视图中 自定义状态码
如何自定义状态码
@app.route('/login')
def func():
return 'login',666 #实际上是一个元祖,犹如 return("login",666) 路由的参数配置
url中参数的定义
尖括号(<int:result>)中存放的是转换器和参数,参数的名称以及对参数类型的限制
请求类型的指定
默认是GET的请求模式
app.route("",methods=["GET","POST"]) #app.route()定义规则
用request.method获取当前请求,查看当前请求是那种请求方式 自定义转换器
自定义一个类继承BaseConverter
重写父类的regex变量
在app.url_map.converters这个字典中增加一组当前所定义的转换器数据(自己定义名字)
像使用int转换器一样的使用它      让自定义的转换器能够接收参数
  自定义一个类继承BaseConverter
  用super重写init方法,在init方法中需要有url_map这个参数以及正则表达式的参数*args,这个参数是我们在使用转换器的时候我们自己传递过来的
  在app.url_map.converters这个字典中增加一组当前所定义的转换器数据
   @app.route("/demo/<re(r'a[0-9]{6}'):uname>")   BaseConverter中的其他两个参数的执行时机
       转换器to_python
  匹配和调用的先后顺序:一定是先匹配,再调用视图函数
  to_python调用的时机:匹配了url之后,在调用视图函数之前
  to_python的作用:用来决定视图函数中的参数的值   转换器to_url
  to_url是给url_for这个函数使用
  作用:决定url_for 中我们传递的参数,最终的地址栏中所呈现出来的状态 请求错误的处理方式
主动抛出状态码(abort)
统一处理错误(@app.errorhandler(404/500/Exception))
    
@app.route("/")
def index():
return "hello word" @app.route("/login")
def func_login():
result = 4/0
abort(404)
return "login......" @app.route("/register")
def func_register():
result = 100 + "111"
abort(500)
return "regsit......" @app.errorhandler(ZeroDivisionError)
def errorhandler(e):
return "除数不能为0" @app.errorhandler(TypeError)
def errorhandler(e):
return "整型和字符型的数据不能进行运算" @app.errorhandler(404)
def func_browser(e):
return "浏览器正在更新,请稍等" @app.errorhandler(500)
def func_server(e):
return "服务器繁忙,请稍后" @app.errorhandler(Exception)
def errorhandler(e):
return "页面正在加载,请稍后" if __name__ == "__main__":
app.run(port=9001, debug=True)
钩子函数(回调函数)
before_first_request
时机:
在开启服务器之后的第一次请求
before_request
时机:
每一个请求之前
使用场景:
对请求统一进行处理,比如黑名单功能 绑定IP地址remote_addr=="192.168.15.60"
after_request
时机:
每一次没有报错的请求之后
场景:
统一的对没有报错的响应进行响应头信息增加,如:
response.headers["Content-Type"] = "application/json"
teardown_request
时机:
每一次请求之后,都会调用
场景:
对错误进行收集 request请求知识
获取请求类型:request.method #获取当前是哪一种请求方式
获取请求的ip地址:request.remote_addr #访问IP地址
获取请求的数据:
request.args.get("xxx") #GET请求数据 获取URL中的参数
request.form.get("xxx") #POST请求数据 获取form表单中的数据
request.files.get("xxx") #获取文件数据
list(request.form.keys("name","pwd"))
request.values.get("user") #取不到返回None
request.values["user"] #直接取用户名
request.values.to_dict() #获取当前表单提交中的所有数据
request.data() #request是基于mimetype进行处理的
request.headers()
print(type(request.headers))
"""
Host: 127.0.0.1:5000
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Referer: http://127.0.0.1:5000/home
Content-Type: application/x-www-form-urlencoded
Content-Length: 26
Cookie:csrftoken=vDIozqveCEfArdYXlM6goHVlSQEn7h4bDygNphL2Feas60DiM2di0jlqKfxo7xhA
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
""" #获取当前的url路径
print(request.path) #/req
# 当前url路径的上一级路径
print(request.script_root)
# 当前url的全部路径
print(request.url) # http://127.0.0.1:5000/req
# 当前url的路径的上一级全部路径
print(request.url_root ) # http://127.0.0.1:5000/ 注意事项
如果url和form中的Key重名的话,form中的同名的key中value会被url中的value覆盖
#http://127.0.0.1:5000/req?id=1&user=20
print(request.values.to_dict()) #{'user': 20 'pwd': 'DragonFire', 'id': '1'} 请求参数携带参数的几种方式
1、http://127.0.0.1/login/zhangan/123456          #直接在地址栏中输入
2、http://127.0.0.1/login?uname=zhangsan&upwd=123456   #利用GET请求
3、http://127.0.0.1/login                 #利用POST请求
uname=zhangsan&upwd=123456 状态的保持
http默认是无状态的,前一个请求和后一个请求之间是独立的,这个是http协议的特性
基于他的这种特性,如果想让不同请求之间可以有关联,需要引入cookie机制 设置cookie
cookie是存储在浏览器端的键值字符串,会伴随着浏览器的自求自动提交到服务器,不同的网站不能共享cookie,保存在本地浏览器中安全性较低,
浏览器第一次发起登录请求该网站时,,如果服务器检测到账号和密码正确,就会给该请求设立一个cookie,浏览器会自动把cookie保存起来,
       下一次请求登录时会把该cookie带到服务器,服务器从当前请求中获取当前所使用的cookie,根据cookie就可以判断当前是谁登录
        
from flask import Flask, make_response, request
app = Flask(__name__) # 存储在客户端
@app.route("/")
def index():
user = request.cookies.get("user_name")
id = request.cookies.get("user_id")
return "%s---%s"%(user,id) @app.route("/login")
def login():
response = make_response("success")
response.set_cookie("user_name", "zhangsan",max_age=3600)
response.set_cookie("user_id", "2",max_age=3600)
# return "success"
return response @app.route("/logout")
def logout():
response = make_response("success")
response.delete_cookie("user_name")
response.delete_cookie("user_id")
return response if __name__ == "__main__":
app.run(port=9001, debug=True)

       设置session
存储在服务器上,对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息在服务器端进行状态保持的方案就是session
session依赖于cookie
from flask import Flask, session

            app = Flask(__name__)

            app.config["SECRET_KEY"] = "wxb"

            # 存储在服务器上
@app.route("/")
def index():
user_id = session.get("user_id", "")
user_name = session.get("user_name", "")
return "%s---%s"%(user_id,user_name) @app.route("/login")
def login():
session["user_name"] = "lisi"
session["user_id"] = "1"
return "success" @app.route("/logout")
def logout():
session.pop("user_name",None)
session.pop("user_id",None)
return "success" if __name__ == "__main__":
app.run(port=9001, debug=True)

    上下文管理器(类似全局变量)
请求上下文
request 当请求发生时,调用视图函数,触发request.get()
session
抛出异常 RuntimeError:working outside of request context
应用上下文
current_app
         current_app.config.get("DEBUG")
g变量
         一般作用于跨py文件,先用g.num存取变量,在再另一个py文件中取值
抛出异常
         RuntimeError:working outside of application context flask_script
pip install flask_script from flask import Flask
flask_script import Manager
app = Flask(__name__)
manager = Manager(app) @app.route("/")
def index():
return "hello world" if __name__ == "__main__":
manager.run(debug=True) flask中可以return的几种写法
  1)return "字符串"
  2)return "字符串",666
  3)return redirect("/")
  4)response = make_response("字符串")
response.set_cookie('username', username)
return response
5)return render_template("demo.html",mylist=["haha","hehe"])
6)response = make_response(render_template("index.html"))
response.set_cookie('username', username)
return response
7)response = redirect(url_for('transfer'))
response.set_cookie('username', username)
return response

web开发框架Flask学习一的更多相关文章

  1. web开发框架Flask学习二

    jinja2模板规范 在当前项目中创建一个文件为templates的文件夹,将其设置为模板文件夹,新建的html为模板页面, 在视图函数中使用render_template(".html的文 ...

  2. 5个最好的Python Web开发框架

    Python是最受欢迎的和最有效率的开发语言之一.Python能让你更快完成工作,并且更有效地集成系统.Python是动态的面向对象的语言.即便你刚刚开始学习Python,也立即就能获得生产力上的提升 ...

  3. 如何选择Web开发框架

    下面先来看看为什么要使用Web开发框架一 使用框架的必然性框架,即framework.其实就是某种应用的半成品,把不同应用程序中有共性的一些东西抽取出来,做成一个半成品程序,这样的半成品就是所谓的程序 ...

  4. Python——轻量级web服务器flask的学习

    前言: 根据工程需要,开始上手另一个python服务器---flask,flask是一个轻量级的python服务器,简单易用.将我的学习过程记录下来,有新的知识会及时补充. 记录只为更好的分享~ 正文 ...

  5. Python轻量Web框架Flask使用

    http://blog.csdn.net/jacman/article/details/49098819 目录(?)[+] Flask安装 Python开发工具EclipsePyDev准备 Flask ...

  6. 【Python】 Web开发框架的基本概念与开发的准备工作

    Web框架基本概念 现在再来写这篇文章显然有些马后炮的意思.不过正是因为已经学习了Flask框架, 并且未来计划学习更加体系化的Django框架,在学习过程中碰到的很多术语等等,非常有必要通过这样一篇 ...

  7. 基于MVC4+EasyUI的Web开发框架经验总结(16)--使用云打印控件C-Lodop打印页面或套打报关运单信息

    在最新的MVC4+EasyUI的Web开发框架里面,我整合了关于网购运单处理的一个模块,其中整合了客户导单.运单合并.到货扫描.扣仓.出仓.查询等各个模块的操作,里面涉及到一些运单套打的操作,不过由于 ...

  8. 基于MVC4+EasyUI的Web开发框架经验总结(6)--在页面中应用下拉列表的处理

    在很多Web界面中,我们都可以看到很多下拉列表的元素,有些是固定的,有些是动态的:有些是字典内容,有些是其他表里面的名称字段:有时候引用的是外键ID,有时候引用的是名称文本内容:正确快速使用下拉列表的 ...

  9. 移动web开发框架

    纯粹的总结一下移动web开发框架,移动web开发框架有jQuery Mobile .Sencha Touch等等,他们都来源于web开发,是成熟的框架,jQuery Mobile出自于jQuery家族 ...

随机推荐

  1. [题解](单调队列)luogu_P2216_BZOJ_1047 理想的正方形

    调了半天,发现这个写法确实极易错...... 对于每列都维护一个单调队列记录最大最小值,这样一次操作后就把最大最小值压到了一维, 然后再对这一行维护一个单调队列,每次更新ans值,然而对于数组和队列下 ...

  2. jq解析json文件

    $.ajaxSettings.async = false;//同步还是异步 $.getJSON(URL,function(data){ //成功后执行 })

  3. python入门之生成器

    生成器 通过列表生成式,可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限得.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果仅仅需要访问前面几个元素,那后面绝大多数元素 ...

  4. vue项目打包后文本溢出代码消失问题

    补充 https://www.cnblogs.com/richard1015/p/8526988.html vue webpack 打包编译-webkit-box-orient: vertical 后 ...

  5. 推荐一个VPS

    有日本节点,不贵,用了两个月,感觉不错 http://www.vultr.com/?ref=6847480

  6. 前端之CSS列表及背景类属性

    一.列表类属性: 1.列表符号样式: list-style-type:disc(实心圆)|circle(空心圆)|square(实心方块)|decimal(数字)|none(去掉列表符号样式); 2. ...

  7. Spring AOP初步总结(二)

    该篇为Spring AOP的一个应用案例:系统日志 需求:将任何删除,更改或新增数据库的操作汇总到数据库中 步骤1:编写切面 @Aspect @Component public class SysLo ...

  8. Error CS0579 Duplicate 'System.Reflection.AssemblyTitleAttribute' attribute

    今天在引入ClassLibraryQikuo的时候突然报错 Error CS0579 Duplicate 'System.Reflection.AssemblyTitleAttribute' attr ...

  9. Sencha Touch和jQuery Mobile的比较

    第一组-行销和平台支持 Sencha Touch和jQuery Mobile都以HTML5框架著称.jQuery Mobile谦虚的说自己只是内建于所有流行的移动设备平台,而Sencha Touch则 ...

  10. LR中订单流程脚本2

    Action(){ //1.设置服务器的IP地址 //lr_save_string("192.168.1.12:8080", "ip"); lr_save_st ...