Flask框架web开发(黑马程序员版本)学习笔记

-00- 初识Flask
Flask框架web开发(黑马程序员版本)学习笔记_第1张图片
中文文档:http://docs.jinkan.org/docs/flask/
英文文档:http://flask.pocoo.org/docs/0.12/

-01- 第一个Flask程序

# -*- coding: utf-8 -*-

#1.导入Flask扩展
from flask import flask

#2.创建应用程序实例
#需要传入_name_,作用是为了确定资源所在的路径
app = Flask(_name_)

#3.定义路由及视图函数
#Flask中定义路由器是通过装饰器实现的
@app.route('/')
def index():
    return 'hello flask'

#4.启动程序
if __name__ == '__main__':
    #执行app.run,就会将Flask程序运行在一个简易的服务器(Flask提供的,用于测试的)
    app.run()

-02- 路由请求方式限定(权限规定)

#默认只支持GET请求,如果需要用其他请求,需要自行添加。
#用postman进行接口请求测试,测试网址可以使用www.tianqiapi.com。

@app.route('/',methods=["GET", "POST"])
def index():
    return 'hello flask'

-03- 路由参数处理(翻书操作)

#同一视图函数传入不同的参数
#<>定义路由的参数,<>内需要起个名字

@app.route('/orders/')
def get_order_id(order_id):
    
    #参数类型,默认是字符串
    print type(order_id)
    
    #需要在视图函数的括号内填入参数名字,后面的代码才能使用
    return 'order_id %s' % order_id
    
#有的时候,需要对路由做访问优化,订单ID应该是int类型
@app.route('/orders/')
    

-04- Jinja2模板引擎

如何返回一个网页(模板)

# *-*coding:utf-8*-*
from flask import Flask,render_template

app = Flask(__name__)

#1.如何返回一个网页(模板)
@app.route("/")
def index():
    return render_template("index.html")

if __name__ == '__main__':
    app.run()

如何给模板填充数据(服务器动态计算)

首先要新建一个HTML文件,作为网站的首页。然后在主程序中import函数render_template来对HTML进行渲染,render_template函数的第一个参数是模板文件名,后面的参数都是键值对,表示模板中变量对应的真实值。

# *-*coding:utf-8*-*
from flask import Flask,render_template

app = Flask(__name__)

#2.如何给模板填充数据(服务器动态计算)
@app.route("/")
def index():
    
    #比如需要传入网址    
    url_str = 'www.baidu.com'    
    return render_template("index.html",url_str=url_str)#前面是值,后面是名字

if __name__ == '__main__':
    app.run()

用键值对传入参数,然后在HTML文件中用两个花括号来使用这个变量。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

这是一个模板<br>
这是一个标签<br>

{{ url_str }}<br>

</body>
</html>

-05- 变量代码块的使用

在Jinja2中,使用{# #}进行注释,快捷键Ctrl + /
使用{{ }} 来表示变量名,这种语法叫做变量代码块

def index():
    
    #比如需要传入网址、列表、字典    
    url_str = 'www.baidu.com'  
    my_list = [1, 2, 3, 4]
    my_dict = {"name": "zyt", "keywords":"lucky" }
    
    #通常模板中使用的变量名和要传递的数据的变量名保持一致
    return render_template("index.html",url_str=url_str,my_list=my_list,my_dict=my_dict)
<body>
这是一个模板<br>
这是一个标签<br>

{#下面是一个变量代码块的使用#}
{{ url_str }}<br>

{# 列表的使用#}
{{ my_list }}<br>
{{ my_list.2 }}<br>
{{ my_list[2] }}<br>

{# 字典的使用#}
{{ my_dict }}<br>
{{ my_dict.name }}<br>
{{ my_dict["name"] }}<br>
</body>

-06- 控制代码块的使用

<hr>
{#for循环的使用,建议写先写for,然后按住tab进行补全}
{% for num in my_list %}
    {#数据大于3,才能显示#}
    {% if num >3 %}
        {{ num }} <br>
    {% endfor %}
{% endfor %}

</hr>

-07- 过滤器的使用

常见内建过滤器
safe:禁用转义
capitalize:单词的首字母大写
lower和upper:大小写转换
title:一句话中每个单词的首字母大写
reverse:翻转
truncate:字符截断

<hr>
{# 过滤器 #}

{# 字符串变大写 #}
{{ url_str | upper }}<br>
{# 字符串反转 #}
{{ url_str | reverse }}<br>

{# 过滤器的链式调用 #}
{{ url_str |upper| reverse }}<br>

</hr>

-08- 普通的表单验证 + flash消息闪现

在html页面中直接写form表单

<form method="post">
    <label>用户名:</label> <input type="text" name="username"><br>
    <label>密码:</label> <input type="password" name="password"><br>
    <label>确认密码:</label> <input type="password" name="password2"><br>
    <input type="submit" value="提交"><br>
    { # 使用遍历获取闪现的消息 #}
    {% for message in get_flashed_messages() %}
        {{ message }}
    {% endfor %}
</form>

视图函数中获取表单数据

# *-*coding:utf-8*-*
from flask import Flask,render_template,request

app = Flask(__name__)

app.secret_key = 'itheima'

'''
目的:实现一个简单的登录的逻辑处理
1.路由需要有get和post两种请求方式————>需要判断请求方式
2.获取请求参数
3.判断参数是否填写 & 密码是否相同
4.如果判断都没有问题,就返回一个success

'''

'''
给模板传递消息
flash ————>需要对内容加密,因此需要设置secret_key,做加密消息的混淆
模板中需要遍历消息
'''

@app.route("/",methods=['get','post'])
def index():
    #request:请求对象 ————> 获取请求方式、数据
    
    #1.判断请求方式
    if request.method =='post':
    
        #2.获取请求参数
        username = request.form.get('username')
        password = request.form.get('password')
        password2 = request.form.get('password2')
        
        #3.判断参数是否填写 & 密码是否相同
        if not all([username,password,password2]):
            # print '参数不完整'
            flash(u'参数不完整')
            
        elif password != password2:
            # print '密码不一致'
            flash(u'密码不一致')
        else :
            return 'success'
    
    return render_template("index.html")

if __name__ == '__main__':
    app.run()

-09- 使用Flask-WTF实现表单+逻辑验证

模板页面:

<form method="post">
	{# 开启CSRF_TOKEN #}
    {{ form.csrf_token }}
    {{ form.username.label }}{{ form.username }}<br>
    {{ form.password.label }}{{ form.password }}<br>
    {{ form.password2.label }}{{ form.password2 }}<br>
    {{ form.submit}}
</form>

视图函数

from flask_wtf import FlaskForm
from wtfforms import StringField,PasswordField,SubmitField

# 解决编码问题
import sys
reload(sys)
sys.setdefaultencoding("utf-8")

'''
使用WTF实现表单
自定义表单类
'''

class LoginForm(FlaskForm):
    username = StringField('用户名',validators = [DataRequired()])
    password = PasswordField('密码',validators = [DataRequired()])
    password2 = PasswordField('确认密码',validators = [DataRequired()EqualTo('password','密码填入不一致')])
    submit = SubmitField('提交')
    
@app.route('/form', methods=['get','post'])
def login():
    login_form = LoginForm()
    #1.判断请求方式
    if request.method =='post':
    
        #2.获取请求参数
        username = request.form.get('username')
        password = request.form.get('password')
        password2 = request.form.get('password2')
            
        #3.验证参数  WTF可以一句话就实现所有的校验
        # 我们没有CSRF_token
        if login_form.validate_on_submit():
            print username, password
            return 'success'
            
        else:
            flash('参数有误')
    
    return render_template('index.html', form=login_form)

你可能感兴趣的:(学习笔记,flask,前端,python)