【黑马程序员 6节课入门Flask框架web开发视频】基础入门


一、flask简介

WEKA作为一个公开的数据挖掘工作平台,集合了大量能承担数据挖掘任务的机器学习算法,包括对数据进行预处理,分类,回归、聚类、关联规则以及在新的交互式界面上的可视化。

如果想自己实现数据挖掘算法的话,可以参考weka的接口文档。在weka中集成自己的算法甚至借鉴它的方法自己实现可视化工具并不是件很困难的事情。


二、第一个flask程序

111
在这里插入图片描述

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

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

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

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

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

执行后点击生成的网页,就可以看到"hello world"的字样。

Flask调用视图函数后,可以返回两种内容:

  • 字符串内容:将视图函数的返回值作为响应的内容,返回给客户端(浏览器)
  • HTML模版内容:获取到数据后,把数据传入HTML模板文件中,模板引擎负责渲染HTTP响应数据,然后返回响应数据给客户端(浏览器)

比如新建一个flask文件夹后,在template文件夹中新建一个html文件,命名为index,并在中输入<h1>HW<h1>字样,并将上文的第四行改成"from flask import Flask,render_template",第14行替换为"return render_template(“index.html”)",则返回的是html模板,打开后为模板的HW字样。


三、路由相关

1. 路由请求方式的限定

为了验证和演示调试结果,引入接口测试软件Postman。

  • Postman下载安装地址:https://www.postman.com/downloads/
  • Postman是一个接口测试工具,不仅可以调试简单的css、html、脚本等简单的网页基本信息,Postman还可以发送几乎所有类型的HTTP请求!Postman简化了API生命周期的每个步骤并简化了协作。

Postman调试示例
在methods处对路由进行选择,相应的可在Postman中调试。

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

# 1.导入Flask扩展
# -*- coding:utf-8 -*-

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

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

# 3.定义路由及视图函数
# flask中定义路由是通过装饰器实现的
# 路由默认只支持GET,如果需要增加,需要自行指定
@app.route('/',methods=['GET','POST'])
def index():
    return "hello world"
    # return render_template("index.html")

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

2. 路由参数处理

在生成的网址后加上/orders/xxx(xxx可为数字,可为字母),打开的网页会出现"order_id xxx"字样。
访问优化:如果想对xxx进行整数类型限定,在<>内加上“int:”。

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

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

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

# 3.定义路由及视图函数
# flask中定义路由是通过装饰器实现的
# 路由默认只支持GET,如果需要增加,需要自行指定
@app.route('/',methods=['GET','POST'])
def index():
    return "hello world"
    # return render_template("index.html")

# 使用同一个视图函数来显示不同用户的订单信息
# <>定义路由的参数,<>内需要起个名字
@app.route('/orders/<order_id>')
def get_order_id(order_id):

	#参数类型,默认是字符串,unicode编码
	print type(order_id)

    # 需要在视图函数的()内填入参数名,后面的代码才能使用
    return "order_id %s" % order_id

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


四、Jinja2模板引擎

Jinja2 是 Python 下一个被广泛应用的模板引擎,是由Python实现的模板语言,他的设计思想来源于 Django 的模板引擎,并扩展了其语法和一系列强大的功能,其是Flask内置的模板语言。

1.简单使用

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{#这是index.html文件内容#}
{{ url_str }}<br>
</body>
</html>
# -*- coding:utf-8 -*-

from flask import Flask,render_template

app=Flask(__name__)

# 1.如何返回一个网页(模板)
# 2.如何给模板填充数据
@app.route('/',methods=['GET','POST'])
def index():

    # 动态传入参数
    url_str="www.baidu.com"

    return render_template("index.html",url_str=url_str)

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

2.变量代码块的基本使用

  • {{}}来表示变量名,这种语法叫做变量代码块。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{#下面是一个变量代码块的使用#}
{{ url_str }}<br>

{#列表的使用#}
{{ my_list }}<br>

{#取 index为 2 的数据#}
{{ my_list.2 }}<br>
{{ my_list[2] }}<br>

{#字典的使用#}
{{ my_dict }}<br>
{{ my_dict.url }}<br>
{{ my_dict['url'] }}<br>


</body>
</html>
# -*- coding:utf-8 -*-

from flask import Flask,render_template

app=Flask(__name__)

# 1.如何返回一个网页(模板)
# 2.如何给模板填充数据
@app.route('/',methods=['GET','POST'])
def index():

    # 比如需要传入网址
    url_str="www.baidu.com"

    my_list=[1,3,5,7,9]

    my_dict={
        'name':'问就ycy',
        'url':'www.baidu.com'
    }

    return render_template("index.html",url_str=url_str,my_list=my_list,my_dict=my_dict)

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

3.控制代码块的基本使用

  • 用{%%}定义的控制代码块,可以实现一些语言层次的功能,比如循环或者if语句。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{#下面是一个变量代码块的使用#}
{{ url_str }}<br>

{#列表的使用#}
{{ my_list }}<br>

{#取 index为 2 的数据#}
{{ my_list.2 }}<br>
{{ my_list[2] }}<br>

{#字典的使用#}
{{ my_dict }}<br>
{{ my_dict.url }}<br>
{{ my_dict['url'] }}<br>

{#下面是一个控制代码块的使用#}
<hr>

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

{% endfor %}


</body>
</html>

4.过滤器的基本使用

过滤器的本质就是函数,可用于修改变量的显示,甚至格式化、运算等等,而在模板中不能直接调用python的某些方法,这就用到了过滤器。

使用方式:变量名 | 过滤器

常用的过滤器

  • 字符串操作
    safe:禁用转义 {{ ‘hello’ | safe }}
    capitalize:把变量值的首字母转成大写,其余字母转小写{{ ‘hello’ | capitalize }}
    lower:把值转成小写 {{ ‘HELLO’ | lower }}
    upper:把值转成大写{{ ‘hello’ | upper }}
    title:把值中的每个单词的首字母都转成大写 {{ ‘hello’ | title }}
    reverse:字符串反转 {{ ‘olleh’ | reverse }}
    format:格式化输出 {{ ‘%s is %d’ | format(‘name’,17) }}
    striptags:渲染之前把值中所有的HTML标签都删掉 {{ ‘hello’ | striptags }}
    truncate: 字符串截断 {{ ‘hello every one’ | truncate(9)}}
  • 列表操作
    first:取第一个元素 {{ [1,2,3,4,5,6] | first }}
    last:取最后一个元素 {{ [1,2,3,4,5,6] | last }}
    length:获取列表长度 {{ [1,2,3,4,5,6] | length }}
    sum:列表求和 {{ [1,2,3,4,5,6] | sum }}
    sort:列表排序 {{ [6,2,3,1,5,4] | sort }}
  • 链式调用
    {{variable | filter_name1 | filter_name2 | filter_name3…}}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
{#下面是一个变量代码块的使用#}
{{ url_str }}<br>

{#列表的使用#}
{{ my_list }}<br>

{#取 index为 2 的数据#}
{{ my_list.2 }}<br>
{{ my_list[2] }}<br>

{#字典的使用#}
{{ my_dict }}<br>
{{ my_dict.url }}<br>
{{ my_dict['url'] }}<br>

{#下面是一个控制代码块的使用#}
<hr>

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

{% endfor %}

{#过滤器#}
{#字符串变大写#}
{{ url_str | upper }}<br>
{#字符串反转#}
{{ url_str | reverse }}<br>
{#过滤器链式调用#}
{{ url_str | reverse | upper}}<br>

</body>
</html>

五、表单信息

1.Web表单

web表单是web应用程序的基本功能。

它是HTML页面中负责数据采集的部件。表单有三个部分组成:表单标签、表单域、表单按钮。表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据提交给服务器。

在Flask中,为了处理web表单,我们一般使用Flask-WTF扩展,它封装了WTForms,并且它有验证表单数据的功能。

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

<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 get_flashed_message in get_flashed_messages() %}
        {{ get_flashed_message }}
    {% endfor %}
</form>

</body>
</html>
# -*- coding:utf-8 -*-

from flask import Flask,render_template,request

app=Flask(__name__)

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

@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('参数不完整')
        elif password!=password2:
            print('密码不一致')
        else:
            return 'SUCCESS'

    return render_template("index.html")

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

2.flash消息闪现

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

from flask import Flask,render_template,request,flash

app=Flask(__name__)

app.secret_key='ccyy'

'''
目的:实现一个简单的登录的逻辑处理
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('参数不完整')
        elif password!=password2:
            # print('密码不一致')
            flash('密码不一致')
        else:
            return 'SUCCESS'

    return render_template("index.html")

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

3.WTF表单的显示

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

<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 get_flashed_message in get_flashed_messages() %}
        {{ get_flashed_message }}
    {% endfor %}
</form>

<hr>

<form method="post">
    {{ form.username.label }}{{ form.username }}<br>
    {{ form.password.label }}{{ form.password }}<br>
    {{ form.password2.label }}{{ form.password2 }}<br>
    {{ form.submit }}<br>
</form>

</body>
</html>
# -*- coding:utf-8 -*-

from flask import Flask,render_template,request,flash
from flask_wtf import FlaskForm
from wtforms import StringField,PasswordField,SubmitField

# 解决编码问题
import importlib,sys
importlib.reload(sys)

app=Flask(__name__)

app.secret_key='ccyy'

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

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

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

class LoginForm(FlaskForm):
    username = StringField('用户名:')
    password = PasswordField('密码:')
    password2 = PasswordField('确认密码:')
    submit = SubmitField('提交')

@app.route('/form',methods=['GET','POST'])
def login():
    login_form=LoginForm()
    return render_template('index.html',form=login_form)

@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('参数不完整')
        elif password!=password2:
            # print('密码不一致')
            flash('密码不一致')
        else:
            return 'SUCCESS'

    return render_template("index.html")

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

使用importlib,sys解决编码问题,其原因是python在安装时,默认的编码是ascii,当程序中出现非ascii编码时,python的处理常常会报错。

当前为python3的解决方法,如果是python2,将该部分代码替换为

import sys
reload(sys)
sys.setdefaultencoding(‘utf-8)

4.WTF的逻辑验证

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

<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 get_flashed_message in get_flashed_messages() %}
        {{ get_flashed_message }}
    {% endfor %}
</form>

<hr>

<form method="post">
    {{ form.csrf_token() }}
    {{ form.username.label }}{{ form.username }}<br>
    {{ form.password.label }}{{ form.password }}<br>
    {{ form.password2.label }}{{ form.password2 }}<br>
    {{ form.submit }}<br>
</form>

</body>
</html>
# -*- coding:utf-8 -*-

from flask import Flask,render_template,request,flash
from flask_wtf import FlaskForm
from wtforms import StringField,PasswordField,SubmitField
from wtforms.validators import DataRequired,EqualTo

# 解决编码问题
import importlib,sys
importlib.reload(sys)

app=Flask(__name__)

app.secret_key='ccyy'

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

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

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

class LoginForm(FlaskForm):
    username = StringField('用户名:',validators=[DataRequired()])
    password = PasswordField('密码:',validators=[DataRequired()])
    password2 = PasswordField('确认密码:',validators=[DataRequired(),EqualTo('password',message='密码不一致')])
    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可以一句话就实现所有校验
        if login_form.validate_on_submit():
            print(username,password)
            return 'success'
        else:
            flash('参数有误')

    return render_template('index.html',form=login_form)

@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.判断参数是否填写&密码是否相同
        # 我们没有CSRF_token
        if not all([username,password,password2]):
            # print('参数不完整')
            flash('参数不完整')
        elif password!=password2:
            # print('密码不一致')
            flash('密码不一致')
        else:
            return 'SUCCESS'

    return render_template("index.html")

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


六、参考

http://docs.jinkan.org/docs/flask/index.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flask Web开发入门到精通》是一本介绍如何使用Flask来进行Web开发的书籍。Flask是一个基于Python的轻量级Web框架,它简单易学、灵活且功能强大,适用于各种规模的Web开发项目。 这本书从基础概念开始讲解,详细介绍了Flask的工作原理、核心组件和基本用法。读者可以学习如何搭建一个简单的Flask应用,并通过实例了解路由、模板、表单处理、数据库操作等关键知识点。书中还提供了大量的示例代码和实践项目,帮助读者深入理解Flask的各种功能和技术应用。 同时,《Flask Web开发入门到精通》也从入门到精通的过程,逐步介绍了如何构建复杂的Web应用。读者可以学习如何优化性能、处理用户认证和授权、实现RESTful API等高级技术。此外,书中还对与其他常用工具如数据库、前端框架的集成等进行了探讨。 云盘是指云存储服务,它通过网络为用户提供存储和备份服务。在网络时代,云盘成为了人们共享和传输文件的重要方式。对于Flask Web开发入门到精通这样的书籍来说,如果有相关的云盘提供,会方便读者获取书籍的各种资源,如代码示例、实例项目、扩展模块等。 利用云盘存储这些资源,读者可以方便地进行下载、备份和共享。此外,云盘还提供了多种访问方式,可以在不同的设备上随时随地进行访问,方便读者在学习过程中的查阅和使用。 总而言之,《Flask Web开发入门到精通》是一本全面介绍Flask框架的书籍,通过学习这本书,读者可以掌握Flask基础知识和高级应用技巧。如果提供相应的云盘服务,将对读者的学习和使用带来更多的便利。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值