文档章节

Flask 通关攻略大全

o
 osc_z1hvg4cu
发布于 2018/04/24 20:26
字数 963
阅读 8
收藏 0

精选30+云产品,助力企业轻松上云!>>>

基本使用

from flask import Flask
app = Flask(__name__)
 
@app.route('/')
def hello_world():
    return 'Hello World!'
 
if __name__ == '__main__':
    app.run()

配置文件

在app 中引入

app.config.from_object("settings.DevelopmentConfig")

settings

class BaseConfig(object):
    DEBUG = True
    SECRET_KEY = "随机字符串"


class ProductionConfig(BaseConfig):
    DEBUG = False


class DevelopmentConfig(BaseConfig):
    pass


class TestingConfig(BaseConfig):
    pass

路由

a. 添加路由的两种方式:
	from flask import Flask,render_template,redirect
	app = Flask(__name__)

	"""
	1. 执行decorator=app.route('/index',methods=['GET','POST'])
	2. @decorator
		 - decorator(index)
	"""
	# 路由方式一(*):
	@app.route('/index',methods=['GET','POST'])
	def index():
		return "Index"

	# 路由方式二:
	def order():
		return 'Order'

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


	if __name__ == '__main__':
		app.run()
b. endpoint(默认函数名)
c. 传参数
	@app.route('/index/<int:nid>',methods=['GET','POST'])
	def index(nid):
		print(nid,type(nid))
		
		url_for('index',nid=888)
		
		return "Index"
d. 自定义正则参数

		from flask import Flask,render_template,redirect,url_for
		from werkzeug.routing import BaseConverter
		app = Flask(__name__)


		class RegexConverter(BaseConverter):
			"""
			自定义URL匹配正则表达式
			"""
			def __init__(self, map, regex):
				super(RegexConverter, self).__init__(map)
				self.regex = regex

			def to_python(self, value):
				"""
				路由匹配时,匹配成功后传递给视图函数中参数的值
				:param value:
				:return:
				"""
				return int(value)

			def to_url(self, value):
				"""
				使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数
				:param value:
				:return:
				"""
				val = super(RegexConverter, self).to_url(value)
				return val

		app.url_map.converters['xxx'] = RegexConverter

		@app.route('/index/<xxx("\d+"):nid>',methods=['GET','POST'])
		def index(nid):
			print(nid,type(nid))
			v = url_for('index',nid=999) # /index/999
			print(v)
			return "Index"

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

e. 其他参数
	- 重定向
		from flask import Flask,render_template,redirect
		app = Flask(__name__)

		@app.route('/index',methods=['GET','POST'],redirect_to='/new')
		def index():
			return "老功能"

		@app.route('/new',methods=['GET','POST'])
		def new():
			return '新功能'


		if __name__ == '__main__':
			app.run()
	
		PS: 前端重定向
			- meta/js

重点:
	- url
	- methods 
	- endpoint
	- @app.route('/index/<int:nid1>/<int:nid2>/')
	- url_for 

视图函数

fbv(常用)

import functools

def wapper(func):
    @functools.wraps(func)
    def inner(*args,**kwargs):
        print('before')
        return func(*args,**kwargs)
    return inner

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

cbv

class IndexView(views.MethodView):
    methods = ['GET']
    decorators = [wapper, ]

    def get(self):
        return 'Index.GET'

    def post(self):
        return 'Index.POST'

app.add_url_rule('/index', view_func=IndexView.as_view(name='index2'))  # name=endpoint

请求和响应

请求相关

request.method
request.args
request.form
request.cookies
request.headers
request.path
request.files

obj = request.files['the_file_name']
obj.save('/var/www/uploads/' + secure_filename(obj.filename))

request.values
request.full_path
request.script_root
request.url
request.base_url
request.url_root
request.host_url
request.host

响应相关

return ""
return json.dumps({}) # return jsonify({})
return render_template('index.html',n1=123)
return redirect('/index')

response = make_response(render_template('index.html'))
response = make_response("xxxx")
response.set_cookie('key', 'value')
response.headers['X-Something'] = 'A value'
response.delete_cookie('key')
return response

模板

调用方法基本和Django相同

session

  • 设置:session['username'] = 'xxx'
  • 删除:session.pop('username', None)

蓝图(Blueprint)

目录结构 manage.py

from s8pro import app

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

init.py

from flask import Flask
from .views import account
from .views import admin
from .views import user


app = Flask(__name__)


app.register_blueprint(account.ac)
app.register_blueprint(admin.ad)
app.register_blueprint(user.us)

views 文件夹内 1.account.py

from flask import Blueprint,render_template
import redis

ac = Blueprint('ac',__name__)

@ac.route('/login')
def login():
    conn = redis.Redis()
    return render_template('login.html')


@ac.route('/logout')
def logout():
    return '退出'

2.admin.py

from flask import Blueprint

ad = Blueprint('ad',__name__,url_prefix='/admin')

@ad.before_request
def bf():
    print('before_request')


@ad.route('/home')
def home():
    return 'home'

@ad.route('/xxxx')
def xxxx():
    return 'xxxx'

3.user.py

from flask import Blueprint


us = Blueprint('us',__name__)

@us.route('/info')
def info():
    return 'info'

前缀和子域名

蓝图URL前缀:xxx = Blueprint('account', __name__,url_prefix='/xxx')
蓝图子域名:xxx = Blueprint('account', __name__,subdomain='admin')
    # 前提需要给配置SERVER_NAME: app.config['SERVER_NAME'] = 'xxx.com:5000'
    # 访问时:admin.xxx.com:5000/login.html
    

闪现(message)

message是一个基于Session实现的用于保存数据的集合	
其特点是:使用一次就删除。
@app.route('/x1',methods=['GET','POST'])
def login():
    flash('我要上学校1',category='x1')
    flash('我要上学校2',category='x2')
    return "视图函数x1"

@app.route('/x2',methods=['GET','POST'])
def index():
    data = get_flashed_messages(category_filter=['x1'])
    print(data)
    return "视图函数x2"

中间件

class Middleware(object):
    def __init__(self,old_wsgi_app):
        """
        服务端启动时,自动执行
        :param old_wsgi_app:
        """
        self.old_wsgi_app =old_wsgi_app

    def __call__(self, environ, start_response):
        """
        每次有用户请求道来时
        :param args:
        :param kwargs:
        :return:
        """
        print('before')
        from flask import session,request
        obj = self.old_wsgi_app(environ, start_response)
        print('after')
        return obj

if __name__ == '__main__':
    app.wsgi_app = Middleware(app.wsgi_app)
    app.run()
    """
    1.执行app.__call__
    2.再调用app.wsgi_app方法
    """

常见装饰器

@app.before_request         每次请求进来之前执行
@app.after_request          每次请求进来之后执行
@app.errorhandler(404)      引发404错误时候执行
@app.before_first_request   第一次请求进来之前执行(如创建数据库连接池这样的业务)
@app.template_global()      调用方法{{函数名(参数1,参数2)}}
@app.template_filter()      调用方法{{参数1|函数名(参数2,参数3))}}
上一篇: linux命令--umask
下一篇: [CQOI2018]异或序列
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
Python全栈--目录导航

这里更新以Python语言作为基础,想要成为全栈工程师需要掌握的技能... Python基础语法 day01 初识Python day02 while循环 运算符和编码 day03 字符串 day04 列表和元组 day05 字典和集合 day0...

osc_nlxf5cjq
2018/12/12
1
0
「网易官方」极客战记(codecombat)攻略-游戏开发1-点击步态click-gait

玩游戏:移动到所有 X 标记! 简介 点击代码栏下的测试关卡按钮开始玩游戏。 这一关中,我们已经添加了这个小游戏所需的代码。 你只需要点击测试关卡按钮,然后通过点击鼠标让英雄在房屋周围...

极客战记
02/27
13
0
before_request after_request

Flask我们已经学习很多基础知识了,现在有一个问题 我们现在有一个 Flask 程序其中有3个路由和视图函数,如下: from flask import Flask app = Flask(name) # type:Flask @app.route("/login")...

osc_a99nkwq0
2018/08/20
6
0
光棍节程序员闯关秀过关全攻略(附送小工具)

光棍节程序员闯关秀过关全攻略。程序员的寂寞谁能懂?"SF光棍节程序员闯关秀"智力挑战小游戏火热上线,看看你能闯到第几关? 游戏地址: http://segmentfault.com/game/ ,游戏设计的很Cool。 ...

葡萄城控件技术团队
2014/06/11
22
0
我叫MT online最简单最快速的上手攻略

今天我们来谈谈《我叫MT online》最简单也是最快速的新手上手攻略,可以帮你少走弯路。 新人出来该选择什么卡? 建议主角选择猎人 出来的卡随意练,打到的卡也行(练到20多级你就可以刷活动了...

伊甸网
2013/03/27
19
0

没有更多内容

加载失败,请刷新页面

加载更多

事务特性

ACID ACID : 原子性 - 一致性 - 隔离性 - 持久性 四大特性 原子性: 事务将一组逻辑单元看成 一个操作 , 原子是最小单位不可再分割 一致性: 事务的前后 数据的应该保持一致 隔离性(isolation)...

osc_3grma05a
28分钟前
7
0
微信小程序实现分享到朋友圈

2020年7月8日。微信小程序推出分享朋友圈,所以笔者先来试一下,没想到一下搞成了 。。 按照微信官方文档得第一步,我们需要设置允许发给朋友,在小程序得生命周期里面这样写。 首先,把你的...

osc_a8r2ub9u
30分钟前
7
0
小程序分享到朋友圈 H5打开小程序H5打开APP 「wx-open-launch-weapp」 「wx-open-launch-app」

前言 微信更新了两个功能块 简单使用了下 给大家写篇文章说说 避免走弯路 欧力给! 1.小程序分享到朋友圈 //在页面的js里设置下就ok onShareTimeline(){ return { title: "微视宝...

osc_dwuu5jqk
31分钟前
25
0
解决死锁——哲学家就餐

解决方法有: 1、更改为单个锁 2、将锁排序 产生死锁的原因 产生死锁的原因是一个线程在持有一把锁时又去申请另外一把锁,也就是锁嵌套。而另一把锁被另外一个线程持有。 举个广为人知的例子...

osc_2qah5avr
32分钟前
16
0
面试官:软件测试没搞懂这些,哪里来的自信投简历? 刁钻问得高频的面试题(含答案)

问得高频的问题(含答案) 软件的生命周期(prdctrm) 计划阶段(planning)-〉需求分析(requirement)-〉设计阶段(design)-〉编码(coding)->测试(testing)->运行与维护(running maintrnacne) 测试...

测试人追风
32分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部