Python-S9-Day115——Flask Web框架基础
- 01 今日内容概要
- 02 内容回顾
- 03 Flask框架:配置文件导入原理
- 04 Flask框架:配置文件使用
- 05 Flask框架:路由系统
- 06 Flask框架:请求和响应相关
- 07 示例:学生管理(一)
- 08 示例:学生管理(二)
- 09 Flask框架:模板
- 10 Flask框架:Session
- 11 Flask框架:Flash和特殊装饰器
- 12 Flask框架:中间件
- 13 Flask框架:特殊装饰器
- 14 今日内容总结
01 今日内容概要
1.1 Web框架的基础组成——urls、views;
1.2 路由->视图;
1.3 配置文件的处理;
1.4 路由系统(与Django有些不同,通过装饰器做的)
1.5 视图函数;
1.6 请求相关的数据不一样;
1.7 响应相关的数据不一样;
1.8 模板的渲染;
1.9 不是所有的Web框架都提供session,Flask提供;
1.10 闪现——取一下就没有了;
1.11 中间件;
1.12 蓝图——blueprint,对Flask程序进行目录结构的划分;
1.13 特殊的装饰器;
02 内容回顾
2.1 谈谈Django和Flask的对比、认知;
2.1.1 Django大而全,内部提供了很多的组件,比如ORM、admin、form以及ModelForm、分页等缓存、信号;Flask短小精悍,轻量级,可拓展性很高,适用于小型网站;
2.1.2 Flask可拓展性更高,自定义程度高;
2.1.3 Flask第三方组件拓展,会变得同Django一样;
2.1.4 Django和Flask哪个好呢?就我个人而言,如果比较熟悉的话,Flask更加适合!
2.2 Flask的Django的最大不同点?
2.2.1 request、session
2.3 Flask的知识点
2.3.1 模板和静态文件,在实例化时候配置,app = Flask(__name__,...)
2.3.2 路由——@app.route('/index',methods = ["GET"])
2.3.3 请求:request.form\request.args\request.method
2.3.4 响应:render、redirect
2.2.5 session引入方式:session['score'] = 123,获取方式推荐:session.get('score')不会报错!
2.4 路飞学城总共有几个项目?
2.4.1 管理后台
2.4.2 导师后台
2.4.3 主站(www.luffycity.com)——Vue:2.0;Django:1.11.1
2.5 路飞学城的主站业务?
2.5.1 课程
- 课程列表
- 课程详细
- 课程大纲、导师、推荐课程
- 价格策略
- 章节和课时
- 常见问题
2.5.2 深科技
- 文章列表
- 文章详细
- 收藏
- 评论
- 点赞
2.5.3 支付
- 购物车
- 结算中心
- 立即支付
- Redis(是否做持久化,AOM&RDB)
- 支付宝
- 消息推送——微信服务号
- 构建数据结构——redis中的key进行拼接;
- 购物车超时限制
- 优惠券+贝里+支付宝
2.5.4 个人中心
2.5.5 学习中心
2.5.6 播放视频——CC视频,是否加密?给CC视频打个广告:https://www.bokecc.com/
- 如果购买
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" width="600" height="490" id="cc_A421CCBE1873EA0C9C33DC5901307461"><param name="movie" value="https://p.bokecc.com/flash/single/2660F3A686840FA2_A421CCBE1873EA0C9C33DC5901307461_false_654628F0907DA9AD_1/player.swf" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param value="transparent" name="wmode" /><embed src="https://p.bokecc.com/flash/single/2660F3A686840FA2_A421CCBE1873EA0C9C33DC5901307461_false_654628F0907DA9AD_1/player.swf" width="600" height="490" name="cc_A421CCBE1873EA0C9C33DC5901307461" allowFullScreen="true" wmode="transparent" allowScriptAccess="always" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash"/></object>
03 Flask框架:配置文件导入原理
3.1 找到类的方式方法(通过一个路径“settings.Foo”可以找到类并获取其中的大写的静态字段);
settings.py;
class Foo:
DEBUG = True
TEST = True
xx.py;
import importlib path = "settings.Foo" p, c = path.rsplit('.', maxsplit=1)
m = importlib.import_module(p)
cls = getattr(m, c)
print(cls) # <class 'settings.Foo'> # 如何找到这个类呢?
for key in dir(cls):
if key.isupper():
print(key, getattr(cls, key))
04 Flask框架:配置文件使用
4.1 Flask配置文件之app.config;
from flask import Flask, render_template, redirect, request, session app = Flask(__name__)
print(app.config)
# app.config.from_object("settings.Dev") # 推荐使用该方式;
app.config.from_object("settings.Production") # 推荐使用该方式;
print(app.confg)
'''
<Config {
'ENV': 'development',
'DEBUG': False,
'TESTING': False,
'PROPAGATE_EXCEPTIONS': None,
'PRESERVE_CONTEXT_ON_EXCEPTION': None,
'SECRET_KEY': None,
'PERMANENT_SESSION_LIFETIME': datetime.timedelta(31),
'USE_X_SENDFILE': False,
'SERVER_NAME': None,
'APPLICATION_ROOT': '/',
'SESSION_COOKIE_NAME': 'session',
'SESSION_COOKIE_DOMAIN': None,
'SESSION_COOKIE_PATH': None,
'SESSION_COOKIE_HTTPONLY': True,
'SESSION_COOKIE_SECURE': False,
'SESSION_COOKIE_SAMESITE': None,
'SESSION_REFRESH_EACH_REQUEST': True,
'MAX_CONTENT_LENGTH': None,
'SEND_FILE_MAX_AGE_DEFAULT': datetime.timedelta(0, 43200),
'TRAP_BAD_REQUEST_ERRORS': None,
'TRAP_HTTP_EXCEPTIONS': False,
'EXPLAIN_TEMPLATE_LOADING': False,
'PREFERRED_URL_SCHEME': 'http',
'JSON_AS_ASCII': True,
'JSON_SORT_KEYS': True,
'JSONIFY_PRETTYPRINT_REGULAR': False,
'JSONIFY_MIMETYPE': 'application/json',
'TEMPLATES_AUTO_RELOAD': None,
'MAX_COOKIE_SIZE': 4093}>
''' if __name__ == '__main__':
app.run()
4.2 配置文件的灵活使用方式;
4.2.1 通过引用settings配置文件中的内容进行赋值修改app.config.from_object("settings.Production")# 推荐使用该方式;
4.2.2 在settings配置文件中,通过定义父类,子类继承父类的方法,进行“开发、测试、预上线、生产环境等”灵活配置;
class Config(object):
DEBUG = False
TESTING = False
DATABASE_URL = 'jdbc:sqlite:identifier.sqlite' class Development(Config):
"""开发环境配置"""
DATABASE_URL = 'mysql://username@localhost/foo' class Testing(Config):
"""测试环境配置"""
DATABASE_URL = 'mysql://username@test.cuixiaozhao.com/foo' class preannouncement(Config):
"""预上线环境配置"""
DATABASE_URL = 'mysql://username@147.198.189.125/foo' class Production(Config):
"""生产环境配置"""
DATABASE_URL = 'mysql://username@47.98.89.123/foo'
05 Flask框架:路由系统
5.1 endpoint,反向生成URL,如果不指定,默认为函数名;
5.2 url_for('endpoint');
5.3 设置动态路由;
from flask import Flask, render_template, redirect, request, session, url_for app = Flask(__name__)
app.config.from_object("settings.Production") # 推荐使用该方式;
print(app.config) # @app.route('/index/<int:nid>', methods=['GET', 'POST'], endpoint='n1') # 作用类似于Diango中的name属性,默认值为函数名;
@app.route('/index/<int:nid>', methods=['GET', 'POST']) # 反向生成,作用类似于Diango中的name属性,默认值为函数名;
def index(nid):
print(nid)
print(url_for('n1', nid=91)) # 如果没有指定endpoint参数,自行指定!
return 'Index' if __name__ == '__main__':
app.run()
5.4 常用的路由系统;
@app.route('/user/<username>')
@app.route('/post/<int:post_id>')
@app.route('/post/<float:post_id>')
@app.route('/post/<path:path>')
@app.route('/login', methods=['GET', 'POST'])
常用路由系统有以上五种,所有的路由系统都是基于一下对应关系来处理: DEFAULT_CONVERTERS = {
'default': UnicodeConverter,
'string': UnicodeConverter,
'any': AnyConverter,
'path': PathConverter,
'int': IntegerConverter,
'float': FloatConverter,
'uuid': UUIDConverter,
}
06 Flask框架:请求和响应相关
6.1 请求相关的数据;
6.2 响应相关的数据;
from flask import Flask, render_template, redirect, request, session, url_for, make_response app = Flask(__name__)
app.config.from_object("settings.Production") # 推荐使用该方式;
print(app.config) # @app.route('/index/<int:nid>', methods=['GET', 'POST'], endpoint='n1') # 作用类似于Diango中的name属性,默认值为函数名;
@app.route('/index/<int:nid>', methods=['GET', 'POST']) # 反向生成,作用类似于Diango中的name属性,默认值为函数名;
def index(nid):
print(nid)
print(url_for('n1', nid=91)) # 如果没有指定endpoint参数,自行指定!
# #########################请求相关###################################
# 请求相关信息
# request.method
# request.args
# request.form
# request.values
# request.cookies
# request.headers
# request.path
# request.full_path
# request.script_root
# request.url
# request.base_url
# request.url_root
# request.host_url
# request.host
# request.files
# obj = request.files['the_file_name']
# obj.save('/var/www/uploads/' + secure_filename(f.filename)) # ###########################响应相关的数据################################
# 定制响应体;
# return "字符串"
# return render_template('html模板路径',**{})
# return redirect('/index.html')
# return jsonify({'k1':'v1'}) # 设置响应头,引入make_response;
# response = make_response(render_template('index.html'))
# response是flask.wrappers.Response类型
# response.delete_cookie('key')
# response.set_cookie('key', 'value')
# response.headers['X-Something'] = 'A value'
# return response return 'Index' if __name__ == '__main__':
app.run()
07 示例:学生管理(一)
7.1 编写路由以及视图函数;
from flask import Flask, render_template, redirect, request, session, url_for, make_response app = Flask(__name__)
app.config.from_object("settings.Production") # 推荐使用该方式;
STUDENT_DICT = {
1: {'name': '崔晓昭', 'age': 18, 'gender': '男'},
2: {'name': '崔晓姗', 'age': 20, 'gender': '女'},
3: {'name': '崔晓丝', 'age': 22, 'gender': '女'},
} @app.route('/index/')
def index():
return render_template('index.html', stu_dic=STUDENT_DICT) @app.route('/delete/<int:nid>')
def delete(nid):
del STUDENT_DICT[nid]
return redirect(url_for('index')) @app.route('/detail/<int:nid>')
def detail(nid):
info = STUDENT_DICT[nid]
return render_template('detail.html', info=info) if __name__ == '__main__':
app.run()
7.2 模本配置,多数语法与Python十分相似;
index.html;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<h1>学生列表</h1>
<table border="1px">
<thead>
<tr>
<th>ID</th>
<th>姓名</th>
<th>年龄</th>
<th>性别</th>
<th>选项</th>
</tr>
</thead>
<tbody>
{% for k,v in stu_dic.items() %}
<tr>
<td>{{ k }}</td>
<td>{{ v.name }}</td>
<td>{{ v.age }}</td>
<td>{{ v.gender }}</td>
<td>
<a href="/detail/{{ k }}">查看详细</a> |
<a href="/delete/{{ k }}">删除</a>
</td>
</tr> {% endfor %} </tbody>
</table>
</body>
</html>
detail.html;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<h1>学生详细</h1>
<ul>
{% for item in info.values() %}
<li>{{ item }}</li>
{% endfor %} </ul>
</body>
</html>
08 示例:学生管理(二)
8.1 史上最LOW的实现方式,Copy、Paste不符合高端程序员的秉性;
from flask import Flask, render_template, redirect, request, session, url_for, make_response app = Flask(__name__)
app.config.from_object("settings.Production") # 推荐使用该方式;
STUDENT_DICT = {
1: {'name': '崔晓昭', 'age': 18, 'gender': '男'},
2: {'name': '崔晓姗', 'age': 20, 'gender': '女'},
3: {'name': '崔晓丝', 'age': 22, 'gen der': '女'},
} @app.route('/login/', methods=["GET", "POST"])
def login():
if request.method == "GET":
return render_template('login.html')
user = request.form.get('user')
pwd = request.form.get('pwd') if user == 'oldboy' and pwd == '':
session['user'] = user
return redirect('/index')
return render_template('login.html', error='用户名或者密码错误!') @app.route('/index/')
def index():
if not session.get('user'):
return redirect(url_for('login'))
return render_template('index.html', stu_dic=STUDENT_DICT) @app.route('/delete/<int:nid>')
def delete(nid):
if not session.get('user'):
return redirect(url_for('login'))
del STUDENT_DICT[nid]
return redirect(url_for('index')) @app.route('/detail/<int:nid>')
def detail(nid):
if not session.get('user'):
return redirect(url_for('login'))
info = STUDENT_DICT[nid]
return render_template('detail.html', info=info) if __name__ == '__main__':
app.run()
8.2 添加装饰器的方法,适用于小范围添加功能;
from flask import Flask, render_template, redirect, request, session, url_for, make_response app = Flask(__name__)
app.config.from_object("settings.Production") # 推荐使用该方式;
STUDENT_DICT = {
1: {'name': '崔晓昭', 'age': 18, 'gender': '男'},
2: {'name': '崔晓姗', 'age': 20, 'gender': '女'},
3: {'name': '崔晓丝', 'age': 22, 'gen der': '女'},
} import functools def auth(func):
@functools.wraps(func)
def inner(*args, **kwargs):
if not session.get('user'):
return redirect(url_for('login'))
ret = func(*args, **kwargs)
return ret return inner @app.route('/login/', methods=["GET", "POST"])
def login():
if request.method == "GET":
return render_template('login.html')
user = request.form.get('user')
pwd = request.form.get('pwd') if user == 'oldboy' and pwd == '':
session['user'] = user
return redirect('/index')
return render_template('login.html', error='用户名或者密码错误!') @app.route('/index/')
@auth
def index():
return render_template('index.html', stu_dic=STUDENT_DICT) @app.route('/delete/<int:nid>')
@auth
def delete(nid):
del STUDENT_DICT[nid]
return redirect(url_for('index')) @app.route('/detail/<int:nid>')
@auth
def detail(nid):
info = STUDENT_DICT[nid]
return render_template('detail.html', info=info) if __name__ == '__main__':
app.run()
8.3 适用于批量添加功能,类似于“中间件”的原理;
from flask import Flask, render_template, redirect, request, session, url_for, make_response app = Flask(__name__)
app.config.from_object("settings.Production") # 推荐使用该方式;
STUDENT_DICT = {
1: {'name': '崔晓昭', 'age': 18, 'gender': '男'},
2: {'name': '崔晓姗', 'age': 20, 'gender': '女'},
3: {'name': '崔晓丝', 'age': 22, 'gen der': '女'},
} @app.before_request
def XXXX():
if request.path == '/login':
return None
if session.get('user'):
return None
return redirect('/login') @app.route('/login/', methods=["GET", "POST"])
def login():
if request.method == "GET":
return render_template('login.html')
user = request.form.get('user')
pwd = request.form.get('pwd') if user == 'oldboy' and pwd == '':
session['user'] = user
return redirect('/index')
return render_template('login.html', error='用户名或者密码错误!') @app.route('/index/')
def index():
return render_template('index.html', stu_dic=STUDENT_DICT) @app.route('/delete/<int:nid>')
def delete(nid):
del STUDENT_DICT[nid]
return redirect(url_for('index')) @app.route('/detail/<int:nid>')
def detail(nid):
info = STUDENT_DICT[nid]
return render_template('detail.html', info=info) if __name__ == '__main__':
app.run()
09 Flask框架:模板
9.1 模板渲染;
9.1.1 基本数据类型——可以执行Python的基础语法,如:dict.get(),list['xx'];
tpl.html;
{% extends 'layout.html' %}
{% block content %}
{{ users.0 }}
{{ users[0] }}
{{ txt|safe }}
{{ func }}
{{ func(6) }}
{{ sb(1,100) }}
{{ 1|db(1800,92) }}
{% if 1|db(2,3) %}
<div>666</div>
{% else %}
<div>999</div>
{% endif %}
{% include 'form.html' %}
{% macro ccc(name,type = 'text',value = '') %}
<h1>宏</h1>
<input type="{{ type }}" name="{{ name }}" value="{{ value }}">
<input type="submit" value="提交">
{% endmacro %}
{{ ccc('n1') }}
{{ ccc('n2') }} {% endblock %}
9.1.2 传入函数func;
9.1.3 全局定义函数——@app.template_global()、@app.template_filter();
9.1.4 模板继承extends结合block方法;
layout.html;
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>layout</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
{% block content %} {% endblock %}
</body>
</html>
9.1.5 include方法引入模板文件{% include 'form.html' %};
form.html;
<form action="">
cuixiaozhao
cuixiaoshan
cuixiaosi
cuixiaolei
</form>
9.1.6 定义宏;
9.1.7 安全;
- 前端'txt'|safe参数;
- 后端Markup('fdskhfdjksa');
app.py;
from flask import Flask, render_template, redirect, request, session, url_for, make_response, Markup app = Flask(__name__)
app.config.from_object("settings.Production") # 推荐使用该方式;
STUDENT_DICT = {
1: {'name': '崔晓昭', 'age': 18, 'gender': '男'},
2: {'name': '崔晓姗', 'age': 20, 'gender': '女'},
3: {'name': '崔晓丝', 'age': 22, 'gen der': '女'},
} # @app.before_request
# def XXXX():
# if request.path == '/login':
# return None
# if session.get('user'):
# return None
# return redirect('/login') @app.route('/login/', methods=["GET", "POST"])
def login():
if request.method == "GET":
return render_template('login.html')
user = request.form.get('user')
pwd = request.form.get('pwd') if user == 'oldboy' and pwd == '':
session['user'] = user
return redirect('/index')
return render_template('login.html', error='用户名或者密码错误!') @app.route('/index/')
def index():
return render_template('index.html', stu_dic=STUDENT_DICT) @app.route('/delete/<int:nid>')
def delete(nid):
del STUDENT_DICT[nid]
return redirect(url_for('index')) @app.route('/detail/<int:nid>')
def detail(nid):
info = STUDENT_DICT[nid]
return render_template('detail.html', info=info) @app.route('/tpl/')
def tpl():
context = {
'users': ['longtai', 'liusong', 'zhaohuhu'],
'txt': Markup("<input type='text'/>"),
'func': func, }
return render_template('tpl.html', **context) def func(arg):
return arg + 1 @app.template_global()
def sb(a1, a2):
return a1 + a2 @app.template_filter()
def db(a1, a2, a3):
return a1 + a2 + a3 # {{ 1|db(1800,92) }} if __name__ == '__main__':
app.run()
10 Flask框架:Session
10.1 session的生成;
10.2 Flask中的session原理——读取cookie中session对应的值;eyJrMiI6NDU2fQ.DnFwbQ.TF4LMMk1g1WEk1NfQnmCS1OSN6w ,将改值解密并反序列化成字典;当请求结束时候,Flask会读取内存中的字典的值,进行序列化+加密,写入到用户cookies中。
11 Flask框架:Flash和特殊装饰器
11.1 闪现的概念——Flash;
from flask import Flask, render_template, redirect, request, session, url_for, make_response, Markup, flash, \
get_flashed_messages app = Flask(__name__)
app.config.from_object("settings.Production") # 推荐使用该方式;
STUDENT_DICT = {
1: {'name': '崔晓昭', 'age': 18, 'gender': '男'},
2: {'name': '崔晓姗', 'age': 20, 'gender': '女'},
3: {'name': '崔晓丝', 'age': 22, 'gen der': '女'},
} # @app.before_request
# def XXXX():
# if request.path == '/login':
# return None
# if session.get('user'):
# return None
# return redirect('/login') @app.route('/login/', methods=["GET", "POST"])
def login():
if request.method == "GET":
return render_template('login.html')
user = request.form.get('user')
pwd = request.form.get('pwd') if user == 'oldboy' and pwd == '':
session['user'] = user
return redirect('/index')
return render_template('login.html', error='用户名或者密码错误!') @app.route('/index/')
def index():
return render_template('index.html', stu_dic=STUDENT_DICT) @app.route('/delete/<int:nid>')
def delete(nid):
del STUDENT_DICT[nid]
return redirect(url_for('index')) @app.route('/detail/<int:nid>')
def detail(nid):
info = STUDENT_DICT[nid]
return render_template('detail.html', info=info) @app.route('/tpl/')
def tpl():
context = {
'users': ['longtai', 'liusong', 'zhaohuhu'],
'txt': Markup("<input type='text'/>"),
'func': func, }
return render_template('tpl.html', **context) @app.route('/ses/')
def ses():
print(type(session)) # <class 'werkzeug.local.LocalProxy'>
session['k1'] = 123
session['k2'] = 456
del session['k1']
return "Session!" @app.route('/page1/')
def page1():
flash("cuixiaozhao19930911!", 'error')
flash("临时存储数据!", 'info')
flash("临时存储数据!", 'warning')
# session['uuu'] = 123
return "Session uuu123!" @app.route('/page2/')
def page2():
# print(session['uuu'])
print(get_flashed_messages(category_filter=['error']))
return "Session uuu456!" def func(arg):
return arg + 1 @app.template_global()
def sb(a1, a2):
return a1 + a2 @app.template_filter()
def db(a1, a2, a3):
return a1 + a2 + a3 # {{ 1|db(1800,92) }} if __name__ == '__main__':
app.run()
12 Flask框架:中间件
12.1 聊一下Flask的源码;
12.2 Flask中的中间件说明,使用场景较少,一般通过装饰器来做;
from flask import Flask, render_template, redirect, request, session, url_for, make_response, Markup, flash, \
get_flashed_messages app = Flask(__name__) @app.route('/index/')
def index():
print('index')
return "Index" class Middleware(object):
def __int__(self, old):
self.old = old def __call__(self, *args, **kwargs):
ret = self.old(*args, **kwargs)
return ret if __name__ == '__main__':
app.wsgi_app = Middleware(app.wsgi_app)
app.run()
13 Flask框架:特殊装饰器(非常重要)
- before_request
- after_request
- before_first_request
- after_first_request
- template_global
- template_filter
- errorhandler(404),应用非常广泛!
14 今日内容总结
14.1 配置文件;
14.2 路由;
14.3 但凡写装饰器,都要加上 functools;
14.4 视图FBV;Django以参数传输,Flask导入;
14.5 请求和响应;
14.6 模板——继承、include、自定义函数、特殊的装饰器(global)、语法更接近Python;
14.7 session和flash(闪现)以加密的形式存储在用户的token中,默认session的超时时间是31天,Django是2周的时长;
14.8 中间件和特殊的装饰器;__call__方法来做;
14.9 6个装饰器;
Python-S9-Day115——Flask Web框架基础的更多相关文章
- 教程:在 Visual Studio 中开始使用 Flask Web 框架
教程:在 Visual Studio 中开始使用 Flask Web 框架 Flask 是一种轻量级 Web 应用程序 Python 框架,为 URL 路由和页面呈现提供基础知识. Flask 被称为 ...
- python几个轻量级web框架
python几个轻量级web框架 2016-04-11 18:04:34 惹不起的程咬金 阅读数 7944更多 分类专栏: 云计算/大数据/并行计算 Python 我最近发表了一篇名为 ‘7 Mi ...
- 五、WEB框架基础(1)
框架与架构 Python语言有很多web框架,主要是四个,企业级框架Django,高并发处理框架Tornado,快速开发框架Flask,自定义协议框架Twisted. 全栈网络框架封装了网络通信/线程 ...
- Ubuntu16.04采用FastCGI方式部署Flask web框架
1 部署nginx 1.1 安装nginx服务 root@desktop:~# apt-get install nginx -y 1.2 验证nginx服务是否启动 root@des ...
- 比我的脸还干的gan货——Python Flask Web 框架入门
Flask是一个轻量级的基于Python的web框架. 本文适合有一定HTML.Python.网络基础的同学阅读. 1. 简介 这份文档中的代码使用 Python 3 运行.是的,所以读者需要自己在电 ...
- Python Flask Web 框架入门
Python Flask 目录 本文主要借鉴 letiantian 的文章 http://www.letiantian.me/learn-flask/ 一.简介 二.安装 三.初始化Flask 四.获 ...
- 【2018】Python面试题【web框架】
1.谈谈你对http协议的认识. HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议.它可以使浏览器更加高效,使 ...
- Python全栈开发-web框架之django
一:web框架 什么是web框架? Web应用框架(Web application framework)是一种开发框架,用来支持动态网站.网络应用程序及网络服务的开发.这种框架有助于减轻网页开发时共通 ...
- Python云端系统开发入门——框架基础
Django框架基础 这是我学习北京理工大学嵩天老师的<Python云端系统开发入门>课程的笔记,在此我特别感谢老师的精彩讲解和对我的引导. 1.Django简介与安装 Django是一个 ...
随机推荐
- 数据类型 -- uint32_t 类型
整型的每一种都有无符号(unsigned)和有符号(signed)两种类型(float和double总是带符号的),在默认情况下声明的整型变量都是有符号的类型(char有点特别),如果需声明无符号类型 ...
- HDU3371 Connect the Cities
题目描述: 有n个小岛,其中有的小岛之间没有通路,要修这样一条通路需要花费一定的钱,还有一些小岛之间是有通路的.现在想把所有的岛都连通起来,求最少的花费是多少. 输入: 第一行输入T,代表多少组数据. ...
- ffmpeg 命令2
ffmpeg常用基本命令(转) [FFmpeg]FFmpeg常用基本命令 1.分离视频音频流 ffmpeg -i input_file -vcodec copy -an output_file_vid ...
- IOS 某个控件出不来原因(经验分享)
某个控件出不来:(检查原因) 1.frame的尺寸和位置对不对 2.hidden是否为YES 3.有没有添加到父控件中 4.alpha 是否 < 0.01 5.被其他控件挡住了 6.父控件的前面 ...
- IOS UIActionSheet(底部 弹出框的使用)
UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"确定要注销?" delegate:self cancel ...
- opencv approxPolyDP使用
代码: import cv2 import numpy as np # img = cv2.imread('/home/sensetime/edgeBoxes-Cpp-version/output/i ...
- 5-15 笔记 jtopo使用
Jtopo的核心对象有6个,分别是Stage(舞台对象),Scene(场景对象),Node(节点对象),Link(连线对象),Container(容器对象),Effect.Animate(动画效果) ...
- 标准对象 -------JavaScript
本文摘要:http://www.liaoxuefeng.com/ 在JavaScript的世界里,一切都是对象. 但是某些对象还是和其他对象不太一样.为了区分对象的类型,我们用typeof操作符获取对 ...
- AJAXA进行分页(2)
查询功能是开发中最重要的一个功能,大量数据的显示,我们用的最多的就是分页. 在ASP.NET 中有很多数据展现的控件,比如用的最多的GridView,它同时也自带了分页的功能.但是我们知道用GridV ...
- ARC机制中的Strong和weak
什么是ARC Automatic Reference Counting,自动引用计数,即ARC,可以说是WWDC2011和iOS5所引入的最大的变革和最激动人心的变化.ARC是新的LLVM 3.0编译 ...