初识Flask

一、Flask的基本介绍

Flask是一个微型的小而精的Web框架,可扩展性强,内置的组件很少,需要引入第三方组件实现功能业 务,如果开发简单的项目,使用Flask比较快速和方便。如果开发大型项目,需要引入大量的第三方组件,这时Flask会越来越像Django框架。基于wsgi协议部署,使用werkzeug模块实现此协议,模板系统由 Jinja2提供。

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

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

二、初始Flask

1. 三行代码启动一个flask服务

from flask import Flask
app = Flask(__name__)
app.run()

仅仅需要三行代码就可以启动一个flask服务,对于Django,是完全不能做到的。

2. 六行代码实现一个"hello world".

from flask import Flask
app = Flask(__name__)

@app.route("/home")
def func():
    return "hello world"
app.run()

通过看flask中route的源码了解到上面的例子还可以这样写

from flask import Flask

app = Flask(__name__)

def func():
    return "hello world"

app.add_url_rule("/home", view_func=func)
app.run()

3. 请求方式:

from flask import Flask, request

app = Flask(__name__)

@app.route("/home", methods=("GET", "POST"))
def func():
    if request.method == "GET":
        return "GET请求"
    if request.method == "POST":
        return "POST请求"

app.run()

request 与 Django 的不太一样,通过导入的方式使用
from flask import request

4. Flask响应三剑客

  • return "字符串" 响应字符串
  • render_template("xx.html") 响应html页面
  • redirect("/index") 重定向
from flask import Flask, request, render_template, redirect, Markup

app = Flask(__name__)


@app.route("/home", methods=("GET", "POST"))
def func():
    if request.method == "GET":
        return render_template(
             "./home.html", 
              msg=Markup("<i>我是参数,Markup的作用是不让浏览器转义</i>"))   //响应html页面
    if request.method == "POST":
        return redirect("/index")    //响应重定向


@app.route("/index")
def index():
    return "我是index界面的内容"    //响应字符串

app.run()

home.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>我是POST请求</h1>
<h3>我是参数:<br> {{ msg }}</h3>

<form action="" method="post">
    用户:<input type="text" name="username">
    <input type="submit" value="点我提交">
</form>

</body>
</html>

5. 解析request中的属性

ps:补充一下相关知识点:_dict_与dir()的区别:
    1. 实例的dict仅存储与该实例相关的实例属性
    1. dir()是Python提供的一个API函数,dir()函数会自动寻找一个对象的所有属性(包括从父类中继承的属性)。
    1. 一个实例的dict属性仅仅是那个实例的实例属性的集合,并不包含该实例的所有有效属性。所以如果想获取一个对象所有有效属性,应使用dir()。
    1. dir()函数会自动寻找一个对象的所有属性,包括dict中的属性。dict是dir()的子集,dir()包含dict中的属性。
通过打印request对象的_dir_()或者dir()方法,我们可以得到request对象及其父类中的所有属性
request-----> ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', 
'__exit__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', 
'__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', 
'__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 
'__weakref__', '_cached_json', '_get_data_for_json', '_get_file_stream', 
'_get_stream_for_parsing', '_load_form_data', '_parse_content_type', 'accept_charsets', 
'accept_encodings', 'accept_languages', 'accept_mimetypes', 'access_route', 'application', 
'args', 'authorization', 'base_url', 'blueprint', 'cache_control', 'charset', 'close', 
'content_encoding', 'content_length', 'content_md5', 'content_type', 'cookies', 'data', 'date', 
'dict_storage_class', 'disable_data_descriptor', 'encoding_errors', 'endpoint', 'environ', 'files', 
'form', 'form_data_parser_class', 'from_values', 'full_path', 'get_data', 'get_json', 'headers', 
'host', 'host_url', 'if_match', 'if_modified_since', 'if_none_match', 'if_range', 
'if_unmodified_since', 'input_stream', 'is_json', 'is_multiprocess', 'is_multithread', 'is_run_once', 
'is_secure', 'is_xhr', 'json', 'list_storage_class', 'make_form_data_parser', 
'max_content_length', 'max_form_memory_size', 'max_forwards', 'method', 'mimetype', 
'mimetype_params', 'on_json_loading_failed', 'parameter_storage_class', 'path', 'pragma', 
'query_string', 'range', 'referrer', 'remote_addr', 'remote_user', 'routing_exception', 'scheme', 
'script_root', 'shallow', 'stream', 'trusted_hosts', 'url', 'url_charset', 'url_root', 'url_rule', 
'user_agent', 'values', 'view_args', 'want_form_data_parsed']

这么多的属性难道我们都需要记住吗???当然不,挑挑重要的吧!
request.path // route("/home")
request.url // 全url("http://127.0.0.1:5000/home")
request.data //request解不了的数据全放这里
request.json //传过来的数据是application/json时放在这里
request.form //form表单传过来的数据
request.args //获取url上的参数
request.values //request.form和request.args的数据组,常用于测试

6. Jinja2的使用

inja2 与 Django 的template 极为相似,语法更贴切Python,学起来很简单

    1. {{ }} 引用变量及函数
    1. {% %} 有逻辑代码
    1. 不让浏览器转移html代码-->后端:Markup() 前端: | safe
    1. @app.template_global() 定义全局使用的函数
@app.template_global()
def add_sum(*args):
    return sum(args)
    1. @app.template_filter() 过滤
@app.template_filter()
def oushu(sum):
    if not sum % 2:
        return "偶数"
    else:
        return "奇数"

前端使用示例:

<p>{{ add_sum(23,6,1234,523,567,34136,132,6,25) | oushu }}</p>
    1. extends 继承母版
    1. block 母版中定义代码块
    1. include 组件

jianja2的使用和django的template的相关使用一样,不累述,请参考:https://www.jianshu.com/p/b23c77852e33

    1. macro的使用(了解)
    {% macro create_tag(na,ty) %}
        <input type="{{ ty }}" name="{{ na }}" value="{{ na }}">
    {% endmacro %}
    <h1>你往下看</h1>
    {{ create_tag("pppssssss","submit") }}

7. session的使用

flask中的session 是存放在 浏览器cookies中的session ,session值是加密序列化的字符串

  • Flask使用Session时同样需要导入
    from flask import session
  • 当使用session存储数据时如果报以下错误,在实例化Flask后设置秘钥即可 app.secret_key = "加密字符串"就OK了!!!
    image.png
  • session取值
    session["key"] = value
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容