flask的URL与视图

一、虚拟环境安装

安装 pipenv 管理 python 开发环境

  • 安装

pip install pipenv
pipenv install --dev six # 只将模块安装到开发环境中
  • 进入/退出/删除虚拟环境

pipenv shell    # 进入虚拟环境
exit            # 退出虚拟环境
pipenv --rm     # 删除整个环境  不会删除pipfile  退出环境再进行删除
pipenv          # 查看更多命令帮助
pipenv  --venv  # 查看虚拟环境位置

更多命令参考文章

  • 自定义虚拟环境路径

在使用 pycharm 开发时,需要找到对应的 python.exe (也就是设置对应的环境),为了方便管理环境,可以进行自定义设置
在这里插入图片描述

二、项目创建

  • 方法一

利用 pycharm 创建项目(专业版)
在这里插入图片描述
在这里插入图片描述

  • 方法二

app.run这种方式只适合于开发,如果在生产环境中,应该使用Gunicorn或者uWSGI来启动。如果是在终端运行的,可以按ctrl+c来让服务停止。

直接创建
在这里插入图片描述

@app.route("/") 代表访问的是 / 也就是根目录
hello_world 函数就是首页实现的效果
虽然访问 http://127.0.0.1:5000/ 的时候不写/ 也可以访问到首页,但是这样写让代码一目了然
app.run() 让项目跑起来 
跑项目的时候需要注意项目的环境的正确配置,避免项目启动失败哦。

三、启动项目和开启 Debug 模式

Debug mode: off
上面非 Debug 模式进行调试项目需要每次重启项目,所以更改代码,开启 Debug 模式

# 方法一
app.run(debug=True)
# 这个方法有一个 port 参数来改变端口值
# 方法二
# app.debug = True  
# app.run()
# 方法三
# app.config 是个继承字典的类  使用update方法
# app.config.update(DEBUG=True)
# app.run()

# 使用配置文件帮助代码管理
# app.config.from_object(config)
# app.run()

Debug mode: on

Debugger PIN: 758-272-092 在报错的情况下,可直接提供在显示页面进行调试的通信证

四、项目配置

Flask项目的配置,都是通过app.config对象来进行配置的。比如要配置一个项目处于DEBUG模式下,那么可以使用app.config['DEBUG] = True来进行设置,那么Flask项目将以DEBUG模式运行。在Flask项目中,有四种方式进行项目的配置
  1. 直接硬编码
app = Flask(__name__)
app.config['DEBUG'] = True
  1. 因为app.config是flask.config.Config的实例,而Config类是继承自dict,因此可以通过update方法
app.config.update(
   DEBUG=True,
   SECRET_KEY='...'
)
  1. 如果你的配置项特别多,你可以把所有的配置项都放在一个模块中,然后通过加载模块的方式进行配置,假设有一个settings.py模块,专门用来存储配置项的,此时你可以通过app.config.from_object()方法进行加载,并且该方法既可以接收模块的的字符串名称,也可以模块对象
# 1. 通过模块字符串
app.config.from_object('settings')
# 2. 通过模块对象
import settings
app.config.from_object(settings)

4.也可以通过另外一个方法加载,该方法就是app.config.from_pyfile(),该方法传入一个文件名,通常是以.py结尾的文件,但也不限于只使用.py后缀的文件

app.config.from_pyfile('settings.py',silent=True)

from juran

五、URL 与函数映射

一个URL要与执行函数进行映射,使用的是@app.route装饰器。@app.route装饰器中,可以指定URL的规则来进行更加详细的映射。
案例:映射一个文章详情的URL
语法提示:尖括号是固定写法< variable >,指定类型则要写成 < converter:variable >

  • 基本映射(默认string)

string: 默认的数据类型,接受没有任何斜杠/的字符串

# 设置一个列表页面
# http://127.0.0.1:5000/list/12
@app.route("/list/<aid>")
def article_list(aid):
    return "这是第{}篇文章".format(aid)
  • int: 整形 float: 浮点型

# 不接受除了数字之外的
@app.route("/list/<int:aid>")
def article_list(aid):
    return "这是第{}篇文章".format(aid)
  • path: 和string类似,但是可以传递斜杠/

# detial 页面
# 接受参数为 / 和字母  纯数字则调用回 article_list
@app.route("/list/<path:aid>")
def article_detail(aid):
    return "detial-这是第{}篇文章".format(aid)

url 地址 匹配对比:
同时兼具 int 和 path

  • uuid: uuid类型的字符串

  • any:可以指定多种路径

# /<any(article, blog):url_path>/  冒号后面不可以加空格
@app.route("/<any(article, blog):url_path>/")
def item(url_path):
    return url_path
  • =?

通过传统的?=的形式来传递参数,可以通过request.args.get(‘id’)来获取id的值。
如果是post方法,则可以通过request.form.get(‘id’)来进行获取。

# http://127.0.0.1:5000/wd?name=aa
@app.route("/wd")
def baidu():
    return request.args.get("name")
  • 构造URL(url_for)

url_for函数可以帮我们实现通过一个函数去获得这个URL。
url_for()函数接收两个及以上的参数,他接收函数名作为第一个参数,接收对应URL规则的命名参数,如果还出现其他的参数,则会添加到URL的后面作为查询参数。

# return 是页面信息 
# 打印是在编译器控制台内进行打印
@app.route("/")
def index():
    print(url_for("article_list", aid=2))  # article_list 有一个 aid 参数,在 url_for 的时候要带上
    return "hello world"

@app.route("/article/<aid>/")
def article_list(aid):
    return "article list {}".format(aid)

@app.route("/detail/<did>/")
def article_detail(did):
    # print(url_for("index"))   # index 没有参数传入 url
    print(url_for("index", next="/"))   # 传入不存在的参数 打印信息为/?next=%2F  这是对特殊字符/进行了转义
    return "article detail {}".format(did)
  • 指定HTTP 方法

在@app.route()中可以传入一个关键字参数methods来指定本方法支持的HTTP方法,默认情况下,只能使用GET请求

# methods 让其可以接收 GET','POST 两种请求
@app.route("/signup/", methods=['GET','POST'])
def login():
    # print(type(request.args))
    # get 请求
    # http://127.0.0.1:5000/signup/?username=juju
    print(request.args.get('username'))
    # post 请求
    # print(request.form.get("name"))
    return "login"

postman中发送post请求

  • flask 的重定向

在flask中,重定向是通过flask.redirect(location,code=302)这个函数来实现的,location表示需要重定向到的URL,配合url_for()函数来使用,code表示采用哪个重定向,默认是302也即暂时性重定向,可以修改成301来实现永久性重定向

# 访问 http://127.0.0.1:5000/profile/ 会被重定向 状态码302
@app.route("/profile/")
def profile():
    name = request.args.get("name")
    
    if name:
        return name
    else:
        # 重定向
        return redirect(url_for("login"))  # code=301
  • 关于 flask 的响应

  • 字符串。其实Flask是根据返回的字符串类型,重新创建一个werkzeug.wrappers

return "nnn"
  • Response对象,Response将该字符串作为主体,状态码为200,MIME类型为text/html,然后返回该Response对象。
from werkzeug.wrappers import Response

@app.route('/about/')
def about():
	resp = Response(response='about page',status=200,content_type='text/html;charset=utf-8')
	return resp

  • 元组。元组中格式是(response,status,headers)。response为一个字符串,status值是状态码,headers是一些响应头。
return ('关于我们',200)  # 只返回 关于我们
  • dict
  • 可以使用make_response函数来创建Response对象,这个方法可以设置额外的数据,比如设置cookie,header信息
rom flask import make_response

@app.route('/about/')
def about():
    return make_response('about page')  # 这个必须要有返回值
	如果不是以上三种类型。那么Flask会通过Response.force_type(rv,request.environ)转换为一个请求对象
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章