flask基础

Django Web框架  主要用在大型应用中
优点:
    1.大而全,里面的组件非常的多
        ORM:models
缺点:
    资源浪费很严重

Flask Web框架  主要用在小型应用中,他的默认端口是5000
优点:
    1.短小精悍:session
    2.官方承认支持的三方组件:
缺点:
    稳定性相对其他web框架较差,

共同点:
    做web的
    都是基于socket
共同有的方法:
    都得有路由

flask的启动

from flask import Flask

app = Flask(__name__)

app.run

flask的路由

flask的路由其实是一个装饰器,

from flask import Flask,request, render_template
app = Flask(__name__)  #实例化一个Flask对象
@app.route('/')
def index():
    return 'helloword'

app.run()

通过读源码,还有一种路由的方式:

from flask import Flask,request, render_template
app = Flask(__name__)
def index():
return 'helloword' app.add_url_rule('/',view_func=index) app.run()

第一种方法方便写,第二种方法方便读。

 

app.run的工作流程:

app.run(host=‘0.0.0.0’,port=9527,debug=True)本地所有的地址都可以访问这个地址,但端口必须是9527,。

django中  wsgi  应用程序网关接口  把你的请求处理后发送给对应的app中,

flask中  werkzeug  的作用django中wsgi

 

falsk中的视图函数必须要有return,而且必须是一个字符串或者元祖,或者是一个response实例,或者是一个可迭代对象。

flask的视图函数怎么返回一个页面呢?

from flask import Flask,request, render_template
app = Flask(__name__)

@app.route('/login')
def login():
 return render_template('login.html')
app.run()

同样也可以重定向redirect:

from flask import Flask,request, render_template,redirect
app = Flask(__name__)
@app.route('/') # 装饰器 ret_inner = route(index)
def index():
    return 'helloword'
# app.add_url_rule('/',view_func=index)

@app.route('/home')
def home():
    return redirect('/')
app.run()

当我们在页面上怎么发送post请求呢?我们做一个简单的登录

@app.route('/login',methods=('POST','GET')) # 不写methods默认支持get请求,
def login():
    print('访问了login函数...')
    return render_template('login.html')

然后写页面,在一个templates文件夹下写login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>登录</h1>
<form action="/login" method="post">
    <p>用户名:<input type="text" name="username"></p>
    <p>密码:<input type="text" name="password"></p>
    <input type="submit" value="登录">
</form>
</body>
</html>

那我们在页面上的那些用户名密码的参数都提交到哪里去了呢?

@app.route('/login',methods=('POST','GET')) # 不写methods默认支持get请求,
def login():
    print('访问了login函数...')
    met = request.method
    if met == 'GET':
        return render_template('login.html')
    if met == 'POST':
        print(
      ## 存储数据
     request.args, request.data, request.json, request.form, request.values
      # 属性数据
     request.method,
     request.url,
     request.path,
      )
return 'helloword'

post请求中这些都可以保存信息,打印一下,看一下我们提交的信息在哪一个里面。

request.form里面放的是我们form表单中的信息,并且request.form是一个字典,可以用python中字典的方法去获取值。

 

那如果我们用url传进参数,保存在哪里呢?保存在request.args中,同样是一个字典:

request.values是同时获得form和url中的信息,request.values.to_dict是将信息变成字典的形式.

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>登录</h1>
<form action="/login" method="post">
    <p>用户名:<input type="text" name="username"></p>
    <p>密码:<input type="text" name="password"></p>
    <input type="submit" value="登录">
    <p>{{ msg }}</p>
</form>
</body>
</html>

还有一个request.data和request.json中的信息,

当我们前端发送的数据格式为json的时候,他的数据信息会存储在request.json中,如果前端发送的数据格式未知的时候,数据信息会存储在request.data中。

下面说jinjia2模板语言在flask中的用法:

定义三个变量:

STUDENT = {'name': 'Old', 'age': 38, 'gender': ''}

STUDENT_LIST = [
    {'name': 'Old', 'age': 38, 'gender': ''},
    {'name': 'Boy', 'age': 73, 'gender': ''},
    {'name': 'EDU', 'age': 84, 'gender': ''}
]

STUDENT_DICT = {
    1: {'name': 'Old', 'age': 38, 'gender': ''},
    2: {'name': 'Boy', 'age': 73, 'gender': ''},
    3: {'name': 'EDU', 'age': 84, 'gender': ''},
}
@app.route('/detail')
def detail():
    return render_template('detail.html',stu = STUDENT)

在页面上:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<table border="1px">
    <tr>
        <td>name</td>
        <td>age</td>
        <td>gender</td>
    </tr>
    <tr>
        <td>{{ stu.name }}</td>
        <td>{{ stu.get('age') }}</td>
        <td>{{ stu['gender'] }}</td>
    </tr>
</table>
</body>
</html>

换一种方式:

@app.route('/detail')
def detail():
    return render_template('detail.html',stu = **STUDENT)

页面上:

 如果传的参数是一个列表:

for循环取出,

也可以用到if:

 

 如果传的参数是一个字典的嵌套:

页面上:

上面三种取值的时候与python中列表,字典中的取值完全一致,。

这是后端给前端传的数据,那后端能不能给前端传一个标签呢?

然后在页面上接受:

也可以给前端传一个函数:

在前端调用函数:

现在我们在页面上加一个东西:

加上了@app.template_global()之后,不用给前端传这个参数,就表示add_sum函数在任何一个页面中都可以使用了。

在页面上:

还有一个@app.template_filter()的用法,它起到一个过滤的作用:

在页面上:

flask中还有继承模板,

1.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
你好,小王八
{% block xiaowangba %}

{% endblock %}

你好,金王八
{% block jinwangba %}

{% endblock %}
你好,因网吧
{% block yinwangba %}

{% endblock %}
</body>
</html>

2.html

{% extends '1..html' %}

{% block xiaowangba %}
<h1>yuan</h1>
{% endblock %}

{% block jinwangba %}
<h1>alex</h1>
{% endblock %}

{% block yinwangba %}
<h1>wusir</h1>
    {% include '3.html' %}
{% endblock %}

3.html

<h3>这是wusir的主页</h3>

在写上路由:

还有一个知识点,了解一下就行,

 

 然后说flask中的session

先导入from flask import session

然后在登录成功之后设置session,

光设置session是不够的,还要设置一个app.secret_key

 这样就可以在其他视图函数中添加认证,

如果没有登录就不会有session值,就跳转到登录页面。只有登录后才允许访问

 这样写会报错:keyerror的错误,

是因为字典的取值方式错了

 

 


总结:
1.Flask 初识:
    短小精悍,三方支持的组件多
    稳定性较差

2.三行 :启动flask服务
from flask import Flask
app = Flask(__name__)
app.run()

六行:Hello world
from flask import Flask
app = Flask(__name__)
@app.route("/")  # ret_inner = route(index)
def index():
    return "Hello World!"
app.run()

3.Response三剑客:
    return “123” return Response、
    
    from flask import redirect
    return redirect
    
    from flask import render_template
    return render_template

4.request 与 Django 的不太一样,导入的方式使用
from flask import request
存储请求体内部的参数
    request.args get url
    request.from post fromdata
    request.json application/json
    request.data xiaowangba

对象属性
    request.path
    request.url
    

5.Jinja2 与 Django 的template 极为相似
语法更贴切Python
{{  }} 引用变量及函数
{%  %} 带有逻辑代码的
Markup  |safe
@app.template_global()
@app.template_filter()

6.Flask Session
from flask import session
app.secret_key = "加密字符串"

session["key"] = value

flask中的session 是存放在 浏览器cookies中的session
值:加密序列化的

 

posted @ 2018-10-09 21:49  黑猫不是警长  阅读(204)  评论(0编辑  收藏  举报