初识Flask——DEBUG、视图与URL、url_for函数构造

1.Flask简介

  • flask是一款非常流行的Python Web框架,作者是Armin Ronacher,主要有这些优点。
  1. 微框架、简洁、给开发者提供了很大的扩展性。
  2. Flask和相应的插件功能丰富,用起来高效,此外灵活性相较Django框架更高。
  3. 开发效率很高,使用SQLAlchemy的ORM操作数据库可以节省开发者的时间。
  • 使用Flask开发数据库的时候,具体使用SQLAlchemy还是MongoEngine,选择取决于开发者自己。区别于Django,Django内置了非常完善和丰富的功能。想要更换非常麻烦。
  • 把默认的Jinija2模板引擎替换成其他模板引擎十分容易。

入门flask框架项目

 #coding: utf8    

# 从flask框架中导入Flask类
from flask import Flask

# 传入__name__初始化一个Flask实例
app = Flask(__name__)


# app.route装饰器映射URL和执行的函数。这个设置将根URL映射到了hello_world函数上
@app.route('/')
def hello_world():
    return 'Hello World!'


if __name__ == '__main__':
    # 运行本项目,host=0.0.0.0可以让其他电脑也能访问到该网站,port指定访问的端口。默认的host是127.0.0.1,port为5000
    app.run(host='0.0.0.0', port=9000)

此时点击执行,在浏览器中就会显示结果,但是app.run的方式只适合开发环境,在生产环境中,应该使用Gunicorn或者uWSGI来启动。在终端环境运行的,可以按ctrl+c来让服务停止。

  • pycharm开启debug模式和修改host
    在pycharm社区版本中,如果想要开启debug模式和更改端口号,则需要编辑项目配置。直接在app.run中更改是无效的。
    在这里插入图片描述

pipenv

pip install pipenv
# windows下安装pipenv
  • 安装flask框架创建虚拟环境会出现pipfile文件
    pipfile文件
url           # 指定国内pip源,不然下载库会很慢

dev-packages  # 开发环境


packages      # 生产环境
django = "*"  # *表示最新版本

requires      # Python版本

进入/退出/删除虚拟环境

pipenv shell    # 进入虚拟环境
exit            # 退出虚拟环境
pipenv --rm     # 删除整个环境  不会删除pipfile

2项目配置

  • DEBUG模式:flask默认情况下不会开启DEBUG模式,开启以后,代码如有错误会在终端进行提示。
    开启DEBUG模式
  1. 直接在对象上设置
app.debug = True
app.run()
  1. 在对象执行run方法时,传递参数
app.run(debug=True)
  1. 在config属性中直接配置
#app.config属于dict以及list实例,因此有下面两种配置方法
app.config.update(DEBUG=True)
app.config.update({'DEBUG':True})
  • 正常开启debug模式
* Debug mode: on
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 140-448-607
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

注意:只能在开发环境下开启DEBUG模式,因为这会有非常大的安全隐患。另外,在堆栈模式里边查看变量值的时候,页面会弹出对话框提示输入PIN值。这样做的目的是为了更加安全。

通过配置文件的方式开启DEBUG模式
由于flask项目的配置文件都是通过app.config对象进行配置。因此

  1. 硬编码设置
app = Flask(__name__)
app.config['DEBUG'] = True
  1. config是继承自dict类
app.config.update(
   DEBUG=True,
   SECRET_KEY='...'
)
  1. 额外创建一个模块
# 1. 通过模块字符串
app.config.from_object('settings')
# 2. 通过模块对象
import settings
app.config.from_object(settings)
  1. 通过from_pyfile方法调用,该方法传递的是一个以.py结尾的文件名
app.config.from_pyfile('settings.py',silent=True)

3.URL与视图

  • URL与函数的映射
    一个URL要与函数进行映射,在框架里使用的是@app.route装饰器。在装饰器中可以指定URL的规则来进行更加详细的映射。
    实例:
@app.route('/article/<id>/')
def article(id):
   return '%s article detail' % id
# id的值按照指定的规则进行传递

固定写法为<converter:variable>其中converter为类型的名称,variable为自己定义的名字。如<string:id>。

  • 常用的数据类型有:
  1. string:URL默认的数据类型,接收不含斜杠的字符串

string:/斜杠是作为参数的分隔符,不能在后面添,加路由后边如果以/结尾,在浏览器末尾加不加斜杠/都可以。反之不行

  1. int:整型。只能接收整型数据
<int:sid>
#sid只能是整型数据,否则就会出错
  1. float:浮点型
  2. Path:和string类似,但是可以接收分隔符/。
  3. uuid:uuid类型的字符串(比较少见)
  4. any:指定多种路径
@app.route('/<any(article,blog):url_path>/')
def item(url_path):
  return url_path

** 传统的参数传递**

  • GET方法:request.args.get(‘xxx’),在路由中后接?xxx=yyy,就可以获取xxx的值
@app.route('/ie')#默认是GET请求
def baidu():
    return request.args.get('name')

#/ie?name=xxx
  • POST方法:request.form.get(‘xxx’),在路由中,POST请求市在form表单里的。
@app.route('/ie',methods='POST')
#通过methodsd可以指定某种方法来支持HTTP请求,默认是GET方法
def baidu():
    return request.form.get('name')

# /ie?name=xxx

4.url_for构造URL

  • 正常情况下通过url路由可以执行函数,反过来,通过函数名字可以获取这个URL路由。
    语法:url_for(‘函数名’,其他参数作为查询参数,)
from flask import Flask,url_for
app = Flask(__name__)

@app.route('/article/<id>/')
def article(id):
    return '%s article detail' % id

@app.route('/')
def index():
    print(url_for("article",id=1))
    return "首页"

相对于硬编码的方法,url_for的好处是

  1. 以后修改了url路径,可以直接通过函数名,在后面添加相应参数即可,无需修改路由url。
  2. url_for()函数可以自己转义一些特殊字符。
@app.route('/')
def shili():
    print(url_for('article_list', aid=1, page=1, name=1, t=1))
    
@app.route('/article/<aid>/')
def article_list(aid):
    print(url_for('shili', next='/'))
    #?next=%2F

5.页面跳转和重定向

  • 重定向在浏览器上体现的就是页面的跳转
  • 重定向分为:
  1. 永久性重定向(状态码:301):常用于旧网址废弃跳转到新的网址。

  2. 临时性重定向(状态码:302):
    访问某种需要登陆权限的网站,临时跳转到登陆页面。

语法:flask.redirect(location,code=302)
location表示需要重定向到的URL,code表示采用永久还是临时的重定向。一般配合url_for使用

from flask import Flask,request,redirect,url_for

app = Flask(__name__)


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

# 状态码302表示临时重定向 301表示永久重定向

@app.route('/profile/')
def profile():
    name = request.args.get('name')
    if name:
        return name
    else:
        return redirect(url_for('login'),code=301)
if __name__ == '__main__':
    app.run(debug=True)

6.响应Response

在视图函数中,return返回的值只能是:字符串,元组,字典,以及Response对象

  1. Response对象
from flask import Flask, Response,make_response

app = Flask(__name__)


@app.route('/about/')
def about():
	return Response('duke-coder',status=200,mimetype='text/html')
	#Response('返回的字符串',status:200,mimetype:'返回的类型')status是状态码
  1. 使用make_response创建Response对象,该方法可以设置额外的参数数据。
from flask import make_response

@app.route('/about/')
def about():
    return make_response('dk_coder')
  1. 返回元组
from flask import Flask

app = Flask(__name__)


@app.route('/about/')
def about():
	return ('ph','sdf')# 只会返回第一个
	return 'phf',404 #元组常见写法
# 元组一般只会返回第一个,404表示状态码
  1. 返回字符串
from flask import Flask

app = Flask(__name__)


@app.route('/')
def about():
	return 'dk-coder'
  1. 返回字典
from flask import Flask, Response,make_response

app = Flask(__name__)


@app.route('/')
def about():
	return {1:'duke',2:'asf',3:'as'}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值