Python——Flask框架初识--基础知识

 

'''
web框架:
Flak 轻量级,灵活小巧,可以自己造轮子,适合开发web api
Django 功能全,臃肿,不太灵活
Tornado 支持异步,IO性能优秀
'''

'''
MTV|MVT:
M -- model 模型--》数据库
T -- temple 模板--》页面
V -- view 视图 + 路由route--》
'''
flask文档:https://dormousehole.readthedocs.io/en/latest/

目录

1.搭建虚拟环境:

2.创建flask项目

static---静态文件

templates(开发中一般命名为templates,否则*)

3. flask配置

4.路由

4.1 路由+视图函数 

4.2 原生代码写法

4.3 路由变量规则

变量规则

level 1:默认是str

level 2:传递int数据

level 3: 传递path类型

level 4: 传递uuid类型

总结:

5. 路由——url构建(url_for,endpoint)

5.1 url_for

5.2 url_for + endpoint

6.flask——请求对象

6.1 使用request获取表单提交数据 

6.1.1 HTTP 方法

6.1.2 request

6.2 flask请求对象(render_template,redirect)

7.flask——响应对象


 

 

1.搭建虚拟环境:

Linux:virtualenv virtualenvwrapper

下面着重介绍windows下的虚拟环境搭建过程:

  1. 在cmd下输入:pip install virtualenvwrapper-win
  2. 创建虚拟环境:mkvirtualenv 自定义虚拟环境名
  3. 查看当前存在的虚拟环境:在cmd下输入workon
    
    # 创建好的虚拟环境的位置就在:C:\Users\mico\Envs
    # 【注意本机的用户名不能是中文,否则需要重新配置Envs路径】
    # 【或者不想要虚拟环境位置存在C盘的,也可以重新配置Envs路径】
  4. 重新配置Envs路径方法:

         打开控制面板,找到环境变量,按照如下图进行操作:

Python——Flask框架初识--基础知识_第1张图片

                    此时,重新打开cmd再创建虚拟环境的时候,虚拟环境的位置就在所配置的位置

     5. 修改项目的python解释器:

        打开file-->setting,之后按照下图进行操作:

Python——Flask框架初识--基础知识_第2张图片

   6. cmd下切换虚拟环境:workon 虚拟环境名

   7. cmd下推出虚拟环境:deactivate

   8. cmd下删除虚拟环境:rmvirtualenv 虚拟环境名

   9.在pycharm中输入: pip install flask ,安装flask。

  10. 紧接着可以查看当前项目下pip安装的包:pip list

Python——Flask框架初识--基础知识_第3张图片

 

2.创建flask项目

项目结构(红框是必须的): 

 

Python——Flask框架初识--基础知识_第4张图片

static---静态文件

动态的 web 应用也需要静态文件,一般是 CSS 和 JavaScript 文件。理想情况下你的 服务器已经配置好了为你的提供静态文件的服务。但是在开发过程中, Flask 也能做好 这项工作。只要在你的包或模块旁边创建一个名为 static 的文件夹就行了。 静态文件位于应用的 /static 中。

使用特定的 'static' 端点就可以生成相应的 URL

url_for('static', filename='style.css')

这个静态文件在文件系统中的位置应该是 static/style.css 。

templates(开发中一般命名为templates,否则*)

放置HTML文件

*如果模板命名不是默认的templates的时候,在创建flask对象时,需要声明模板名称:
app = Flask(__name__,template_folder='template')  #当前文件的名字

from flask import Flask

# 创建一个该类的实例。第一个参数是应用模块或者包的名称。如果你使用 一个单一模块(就像本例),那么应当使用 __name__ ,因为名称会根据这个 模块是按应用方式使用还是作为一个模块导入而发生变化(可能是 ‘__main__’ , 也可能是实际导入的名称)。这个参数是必需的,这样 Flask 才能知道在哪里可以 找到模板和静态文件等东西。
app = Flask(__name__)  #当前文件的名字


# 使用 route() 装饰器来告诉 Flask 触发函数的 URL 
@app.route('/')  # 注册路由
# 函数名称被用于生成相关联的 URL 。函数最后返回需要在用户浏览器中显示的信息。
def hello_world():
    return 'HELLO hello world'

if __name__ == '__main__':
    # 关联服务器并启动
    # app.run(host='0.0.0.0', port=8000)  # host默认是127.0.0.1,port默认是5000
    # 0.0.0.0 是可以任何人访问你的项目的
    app.run()

运行后:

Python——Flask框架初识--基础知识_第5张图片

Python——Flask框架初识--基础知识_第6张图片

 

可以看出上面运行结果显示的debug模式是关的,现在开启debug模式:

from flask import Flask

app = Flask(__name__)  #当前文件的名字


@app.route('/')  # 注册路由
def hello_world():
    return 'HELLO hello world.'


if __name__ == '__main__':
    # 1.关联服务器并启动
    app.run(host='0.0.0.0', port=5000,debug=True)  # host默认是127.0.0.1,port默认是5000






此时,在Terminal里面输入:python app.py,运行程序:

Python——Flask框架初识--基础知识_第7张图片

在浏览器打开页面:

Python——Flask框架初识--基础知识_第8张图片

然后,在代码中要返回给页面的内容中,添加内容:

from flask import Flask

app = Flask(__name__)  #当前文件的名字


@app.route('/')  # 注册路由
def hello_world():
    return 'HELLO hello world.This is my first flask project'


if __name__ == '__main__':
    # 1.关联服务器并启动
    app.run(host='0.0.0.0', port=5000,debug=True)  # host默认是127.0.0.1,port默认是5000


此时,刷新浏览器,可以看到无需重新运行程序,页面内容就会同步:

Python——Flask框架初识--基础知识_第9张图片

3. flask配置

为了方便,将配置信息单独放在一个配置文件中。

Python——Flask框架初识--基础知识_第10张图片

在代码中导入配置文件:

from flask import Flask
import settings

# 创建flask对象
app = Flask(__name__)  #当前文件的名字

# 在app启动前引入配置文件:

# 方式1:导入配置信息(将配置文件作为一个对象)
app.config.from_object(settings)

# 方式2:导入配置信息(将配置文件作为文件导入)
# app.config.fro    m_pyfile(settings.py)

@app.route('/')  # 注册路由
def hello_world():
    return 'HELLO hello world.This is my first flask project'


if __name__ == '__main__':
    # 启动flask
    app.run()


再运行程序,可以看到配置信息已经生效:

Python——Flask框架初识--基础知识_第11张图片

4.路由

4.1 路由+视图函数 

from flask import Flask
import settings

# 创建flask对象
app = Flask(__name__)  #当前文件的名字

# 在app启动前引入配置文件:

# 方式1:导入配置信息(将配置文件作为一个对象)
app.config.from_object(settings)

# 方式2:导入配置信息(将配置文件作为文件导入)
# app.config.fro    m_pyfile(settings.py)


# 路由+视图函数
@app.route('/')  # 注册路由
def hello_world():  # 视图函数
    return 'HELLO hello world.This is my first flask project'


@app.route('/second')
defe show__abc():
    rturn '

I am the second page

' if __name__ == '__main__': # 启动flask app.run()

运行后,在浏览器打开:http://127.0.0.1:5000/second,可以看到:

Python——Flask框架初识--基础知识_第12张图片

 

4.2 原生代码写法

# 如果不用装饰器@app.route(),我们可以调用底层东西自己来配置【原生】:
def welcome():
    return '欢迎来到我们页面'


app.add_url_rule('/welcome',view_func=welcome)

# 其实,route就是将函数与add_url_rule进行了装饰

4.3 路由变量规则

变量规则

通过把 URL 的一部分标记为  就可以在 URL 中添加变量。标记的 部分会作为关键字参数传递给函数。通过使用  ,可以 选择性的加上一个转换器,为变量指定规则。

 

转换器类型:

string

(缺省值) 接受任何不包含斜杠的文本

int

接受正整数

float

接受正浮点数

path

类似 string ,但可以包含斜杠

uuid

接受 UUID 字符串

level 1:默认是str

Python——Flask框架初识--基础知识_第13张图片

Python——Flask框架初识--基础知识_第14张图片

level 2:传递int数据

# 传递整型数据
@app.route('/demo/')
def demo2(page):   # 视图函数名不能重名
    return '当前是第'+str(page)+'页'

 

Python——Flask框架初识--基础知识_第15张图片

level 3: 传递path类型

# 传递path类型,可以向后识别'/'
@app.route('/demo/')
def demo3(page):
    return '当前是第'+str(page)+'页'

Python——Flask框架初识--基础知识_第16张图片

level 4: 传递uuid类型

# uuid类型
@app.route('/demo/')
def demo4(uid):
    return '===uid界面****'+str(uid)
'''
注意:
uuid类型的必须写在str类型的前面,否则会执行str的函数
'''

 

Python——Flask框架初识--基础知识_第17张图片

PS:可以这样产生一串uid为了测试用

import uuid
@app.route('/demo/')
def demo5():
    uid = uuid.uuid4()
    return str(uid)

总结:

路由变量规则:

    转换器:
    str 默认
    int
    float
    path
    uuid
    
    路径上可以出现变量:
    @app.route('/news/')

关于路径加'/'与不加'/'的问题:

1.加'/':在请求页面的时候,无论是请求带'/'的还是不带'/'的页面都会进入带'/'的页面。

尾部有一个斜杠,看起来就如同一个文件夹。 访问一个没有斜杠结尾的 URL 时 Flask 会自动进行重定向,帮你在尾部加上一个斜杠。

@app.route('/demo/') 如果在浏览器请求的是http://127.0.0.1:5000/demo,则会自动为其加上'/'进入http://127.0.0.1:5000/demo/页面。

2.不加'/'  在请求页面的时候,如果加上了'/'会出现页面not found。可以保证路径的唯一性。

没有尾部斜杠,因此其行为表现与一个文件类似。如果访问这个 URL 时添加了尾部斜杠就会得到一个 404 错误。这样可以保持 URL 唯一,并帮助 搜索引擎避免重复索引同一页面。

@app.route('/demo')  # 如果在浏览器请求的是http://127.0.0.1:5000/demo,可以正常进入页面;如果请求的是http://127.0.0.1:5000/demo/则会出现找不到页面。

 

5. 路由——url构建(url_for,endpoint)

路由:
@app.route('rule',endpoint='value')
def func():
    pass

url_for('endpoint')  #根据endpoint找到对应的路由rule

 

5.1 url_for

要先导入:from flask import Flask,url_for

# url_for,endpoint的使用。(可实现页面跳转)

from flask import Flask,url_for
import settings

# 创建flask对象
app = Flask(__name__)  #当前文件的名字

# 在app启动前引入配置文件:

# 方式1:导入配置信息(将配置文件作为一个对象)
app.config.from_object(settings)

# 方式2:导入配置信息(将配置文件作为文件导入)
# app.config.fro    m_pyfile(settings.py)

# 路由+视图函数
@app.route('/')  # 注册路由
def hello_world():  # 视图函数
    return 'HELLO hello world.This is my first flask project'


@app.route('/second')   # endpoint默认是函数名
def show__second():
    return '

I am the second page

' @app.route('/sec') def show_sec(): res = url_for('show__second') # 里面的值是endpoint的值,endpoint默认是函数名 print(res) # 返回show_second所在的路由。反向解析路由。 return 'show_sec' if __name__ == '__main__': # 启动flask app.run()

Python——Flask框架初识--基础知识_第18张图片

 

Python——Flask框架初识--基础知识_第19张图片

5.2 url_for + endpoint

# url_for,endpoint的使用。(可实现页面跳转)

from flask import Flask,url_for
import settings

# 创建flask对象
app = Flask(__name__)  #当前文件的名字

# 在app启动前引入配置文件:

# 方式1:导入配置信息(将配置文件作为一个对象)
app.config.from_object(settings)

# 方式2:导入配置信息(将配置文件作为文件导入)
# app.config.fro    m_pyfile(settings.py)

# 路由+视图函数
@app.route('/')  # 注册路由
def hello_world():  # 视图函数
    return 'HELLO hello world.This is my first flask project'



@app.route('/third',endpoint='third')
def show__third():
    return '

I am the third page

' @app.route('/happy') def show_happy(): res = url_for('third') # 里面的值是endpoint的值(当指定endpoint时,就不能再用函数名了) # print(res) return 'happy day!' if __name__ == '__main__': # 启动flask app.run()

 

反向解析路由:

给一个函数,去找对应的路由。找到路由后,就可以做页面跳转、重定向等。

 

6.flask——请求对象

flask--请求对象

client 发出请求对象

request 只要有请求,就会返回一个request对象

在 Flask 中由全局对象 request 来提供请求信息。 

首先需要导入:from flask import request

6.1 使用request获取表单提交数据 

6.1.1 HTTP 方法

Web 应用使用不同的 HTTP 方法处理 URL 。当你使用 Flask 时,应当熟悉 HTTP 方法。 缺省情况下,一个路由只回应 GET 请求。 可以使用 route() 装饰器的 methods 参数来处理不同的 HTTP 方法:

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return do_the_login()
    else:
        return show_the_login_form()

如果当前使用了 GET 方法, Flask 会自动添加 HEAD 方法支持,并且同时还会 按照 HTTP RFC 来处理 HEAD 请求。同样, OPTIONS 也会自动实现。 

6.1.2 request

web开发免不了需要获取用户提交的数据,Flask为我们提供了request对象来获取用户提交给服务器的数据。
下面是一个最基本的获取数据的例子:

template文件夹下的login.html文件中添加如下代码:




    
    登录界面


    

提交:

密码:

app3.py文件中添加如下代码:

'''
flask--请求对象

client 发出请求对象

request 只要有请求,就会返回一个request对象
'''


from flask import Flask,url_for,request,render_template
import settings

# 创建flask对象
app = Flask(__name__,template_folder='template')  #当前文件的名字
# template_folder默认是='templates'的,因此可以将自己的模板文件夹改为此名字,或者在这里定义

# 在app启动前引入配置文件:

# 方式1:导入配置信息(将配置文件作为一个对象)
app.config.from_object(settings)

# 方式2:导入配置信息(将配置文件作为文件导入)
# app.config.fro    m_pyfile(settings.py)


# 路由+视图函数
@app.route('/')  # 注册路由
def hello_world():  # 视图函数
    return 'HELLO hello world.This is my first flask project'


@app.route('/login',methods=('GET','POST'))
def user_login():
    if request.method == 'GET':  # 获取请求的方式
        # 获取提交的数据【get形式】 :request.args.get('key', 默认值)
        # print(request.args.get('a'))  # 浏览器请求页面的时候传参: ?a=100&b=3
        return render_template('login.html')
    else:
        # return 'POST'
        # 获取提交的数据【post形式】 :request.form.get('key',默认值)
        uname = request.form.get('username')
        upwd = request.form.get('password',type=str,default=None)  # type是默认的,可以不加

        # request.values获取数据并转化成字典
        uinfo = request.values.to_dict()  # 是一个字典


        return '用户名:'+uname+';密码:'+upwd+uinfo.get('username')


if __name__ == '__main__':
    # 启动flask
    app.run()




Python——Flask框架初识--基础知识_第20张图片

Python——Flask框架初识--基础知识_第21张图片

 

6.2 flask请求对象(render_template,redirect)

使用 render_template() 方法可以渲染模板,你只要提供模板名称和需要 作为参数传递给模板的变量就行了,Flask 会在 templates 文件夹内寻找模板。 

'''
flask--请求对象

client 发出请求对象

request 只要有请求,就会返回一个request对象
'''


from flask import Flask,url_for,request,render_template,redirect
import settings

# 创建flask对象
app = Flask(__name__,template_folder='template')  #当前文件的名字
# template_folder默认是='templates'的,因此可以将自己的模板文件夹改为此名字,或者在这里定义

# 在app启动前引入配置文件:

# 方式1:导入配置信息(将配置文件作为一个对象)
app.config.from_object(settings)

# 方式2:导入配置信息(将配置文件作为文件导入)
# app.config.fro    m_pyfile(settings.py)


# 路由+视图函数
@app.route('/')  # 注册路由
def hello_world():  # 视图函数
    return 'HELLO hello world.This is my first flask project'


@app.route('/login',methods=('GET','POST'))
def user_login():
    if request.method == 'GET':  # 获取请求的方式
        # 获取提交的数据【get形式】 :request.args.get('key', 默认值)
        # print(request.args.get('a'))  # 浏览器请求页面的时候传参: ?a=100&b=3
        return render_template('login.html')
    else:
        # return 'POST'
        # 获取提交的数据【post形式】 :request.form.get('key',默认值)
        uname = request.form.get('username')
        upwd = request.form.get('password',type=str,default=None)  # type是默认的,可以不加

        # request.values获取数据并转化成字典
        uinfo = request.values.to_dict()  # 是一个字典


        return '用户名:'+uname+';密码:'+upwd+uinfo.get('username')


@app.route('/register',methods=('GET','POST'))
def reigster():
    if request.method=='POST':
        pass
    return render_template('register.html')

@app.route('/menu',methods=('GET','POST'))
def menu():
    if request.method=='GET':
        return render_template('menu.html')

@app.route('/notfound')
def not_found():
    return render_template('404.html')   # 渲染模板


@app.route('/news')
def news():
    return redirect('/notfound')    # 重定向


if __name__ == '__main__':
    # 启动flask
    app.run()




menu.html







    
    导航页


    

登录

注册

新闻

register.html








    
    注册


    

提交:

密码:

确认密码:

404.html







    
    404


    

NOT FOUND! ~ 页面找不到啦!

Python——Flask框架初识--基础知识_第22张图片

点击新闻,会看到如下页面:

 

 

Python——Flask框架初识--基础知识_第23张图片

7.flask——响应对象

 

request属性:

  1. response.data:获取二进制的响应body数据
  2. response.data = 'xxx' :设置响应body数据
  3. response.calculate_content_length:获取响应的总字节数
  4. response.header:获取响应对象的头部信息
  5. response.status:获取字符串格式的响应状态码
  6. response.status_code:获取int格式的响应状态码
  7.  
  8. response.freeze():将响应对象序列化,返回None
  9. response.set_cookie():设置cookie
  10. response.delete_cookie():删除cookie,将cookie设置为立即失效

 

参考:

1.千锋教育

2.https://www.cnblogs.com/yanshanketang/p/10746697.html

 

你可能感兴趣的:(Python学习分享)