1.web程序运行的基本流程

  {客户端发送请求 <-----> 服务器返回响应}

2.使用框架可以降低开发难度,提高开发效率。

3.Flask框架的基本认识:

  特点:用Python语言实现的轻量、简洁、扩展性强

   核心:werkzeug 和 Jinja2

4.虚拟环境:

  创建虚拟环境:mkvirtualenv -p python3 名称

   进入虚拟环境:workon

   退出虚拟环境:deactivate

   移除虚拟环境:rmvirtualenv 名称

5.依赖包:

  生成依赖包:pip freeze > requirements.txt

   安装依赖包:pip install -r requirements.txt

6.基本程序:

  创建程序实例:__name__参数为字符串,表示模块名,可以确定程序所在位置,如果传入标准模块名,会影响静态路径的访问,不会影响视图函数的访问。

  定义装饰器路由:通过程序实例调用route函数实现,底层是通过add_url_rule()函数实现,第一个参数rule、第二个参数endpoint(视图函数名的字符串形式),第三个参数视图函数名。

  启动服务器:run方法可以启动服务器,可以指定调试debug,便于调试代码信息,自动跟踪代码的变化。

 # 导入Flask
from flask import Flask # 创建Flask类的对象
# 结论:__name__参数的作用:确认程序实例文件所在的位置。
# 1、必须要传入参数
# 2、参数类型必须是字符串
# 3、如果传入标准模块名,只会影响静态路径的访问,不会影响视图函数的访问。
app = Flask(__name__) # 定义路由url地址
# endpoint:表示视图函数名的字符串形式。
# 不使用装饰器也可以实现路由映射。 @app.route('/Lee',methods=['POST','GET'])
def hello2018():
# return 可以返回状态码,也可以返回不符合http协议的状态码,用来实现前后端的数据交互
"""
前端发送ajax:
$.ajax({
url:'/Lee',
data:。。。, 发送到后端的数据
contentType:'', 发送到后端的数据类型
dataType:'json' 后端返回的数据类型
success:function(resp){
if (resp == '888'){
alert(errmsg)
}else{ } }
}) errno=888,errmsg='用户名已注册' :return:
"""
return 'hello world2018',888
# self.add_url_rule(rule, endpoint, f, **options)
# 通过程序实例调用添加url规则,也可以实现路由映射。
# app.add_url_rule('/123','hello2018',hello2018) # 结论:
# 1、视图函数不能重名。
# 2、url可以重复,不同的http请求方法,是对应不同的操作get查询post插入put修改delete删除
# @app.route('/')
# def hello2019():
# a = 1
# b = 2
# return a,b
# 不能返回字典
# my_dict = {'a':'123'}
# return my_dict
# 不能返回列表
# my_list = [1,2,3]
# return my_list
# 可以返回元组
# return 'hello world' # 启动服务器
# __name__表示当前模块名,如果被导入文件的时候__name__表示文件名
if __name__ == '__main__':
# 查看路由映射:具体的url地址和视图函数名的指向关系。
print(app.url_map)
# debug调试模式:帮助定位错误信息,自动跟踪代码的变化
app.run(debug=True)

7.基本程序扩展:

  视图函数不能重名

  URL可以重复,因为不同的http请求方法代表不同的操作

  路径的访问顺序是从上到下依次查找,如果找到不会继续往下查找

8.加载配置信息:

  加载配置对象

  加载配置文件ini格式文件

  加载环境变量

 from flask import Flask
# 导入配置类
# from config import Config
from config import config_dict
app = Flask(__name__)
# 加载配置文件:三种实现形式
# 1、加载配置对象,config是flask内置的配置对象
# 重点掌握:因为扩展性更强
# app.config.from_object(Config)
# app.config.from_object(config_dict['pro'])
# 2、加载配置文件
# app.config.from_pyfile('config.ini')
# 3、加载环境变量
# app.config.from_envvar('SET') @app.route('/')
def index():
return 'hello world' if __name__ == '__main__':
app.run()

config.py文件:

# 基本配置类
class Config:
DEBUG = None # 开发模式配置
class DevelopmentConfig(Config):
DEBUG = True # 生产模式配置
class ProductionConfig(Config):
DEBUG = False # 定义字典,实现配置类的映射
config_dict = {
'dev':DevelopmentConfig,
'pro':ProductionConfig
}

9.状态码:

  return可以返回不符合http协议的状态码,用来前后端的数据交互。

10.重定向:

  redirect----参数是具体的URL地址

  url_for ----参数是视图函数名(端点endpoint)

# 导入flask内置的函数redirect
from flask import Flask,redirect,url_for app = Flask(__name__) # 重定向redirect:接收参数为location,具体的url地址
# 重新发送网络请求,跳转页面
# 当项目路径(url)或文件发生变化的情况下,可以使用重定向。
@app.route('/')
def index():
url = 'http://www.baidu.com'
# 重定向到百度
return redirect(url) # url_for反向解析:接收的参数endpoint,视图函数名
@app.route('/for')
def demo_url_for():
return redirect(url_for('index')) if __name__ == '__main__':
print(app.url_map)
app.run(debug=True)

11.Flask最基础框架:

 from flask import Flask

 app = Flask(__name__)

 @app.route("/")

 def index():

     return 'hello world'

 if __name__ == '__main__':

     app.run()

12.请求上下文:

  request :请求对象,封装了客户端请求的参数信息;

  session :封装了客户信息,可以用来获取或设置用户信息;

13.应用上下文:

  g对象 :临时请求过程中存储信息,请求结束后会被销毁;

   current_app : 在程序运行过程中,一直存在,保存程序的基本信息;

14.请求勾子:

  before_first_request :在第一次请求前运行

  before_request:每次请求前运行

  after_request:在每次请求后运次,没有异常情况下,指定后端返回的数据格式

  teardown_request:即使没有异常的情况下,在每次请求后运行

15.Flask扩展命令行:自定义ip和port,配合Migrate实现数据库的迁移

16.模板:

  模板的本质是文件,作用是接收视图的返回结果,渲染响应数据

  变量:存储视图返回的结果 {{ 变量名 }}

  判断语句:控制输出

  {%  if  表达式  %}

  {%  endif  %}

  项目中使用的atrTemplate前端模板:

  {{ each  house  as  houseas}}

  数据:

  {{  each }}

17.过滤器:本质是函数,作用计算或格式化输出数据  

  常规过滤器名:

  safe禁用模板转义

  capitalize首字符大写:title/lower/upper/formart/striptag/reverse

  列表处理:sum/sort/first/last

  过滤器的使用:可以链式使用,执行过程,从前到后,依次执行

18.自定义过滤器:

  1.自定义函数,然后添加模板过滤器,app.add_template_filter(),第一个参数为函数名,第二个参数为自定义过滤器名称,如果过滤器名和内置过滤器重名,会重写内置过滤器;

  2.以装饰器的形式实现自定义过滤器,@app.template_filter(),只需要传入自定义的过滤器名;

19.WTF扩展:实现模板页面的表单代码的复用,以及表单数据的验证

  1.自定义表单类,需要继承自FlaskForm;

  2.指定表单字段,加入验证函数;

  3.实例化表单对象,在模板页面中使用表单对象的字段

  [设置"SECRET_KEY",生成csrf_token加密口令,实现跨站请求保护,模板页面对应的表单域中需要设置form.csrf_token()

  验证器的调用:form.validate_on_submit()执行过程,会依据调用验证函数,其次验证页面中是否设置csrf_token,条件满足返回true,否则返回false]

  4.表单数据的获取,需要使用表单对象,form.字段名。data

    wtf对应的csrfprotect模块可以生成session信息,实现跨站请求保护

20.继承、宏、包含:三者皆可实现代码复用

  1、继承:block,实现模板页面固定不变的区域,一般用来写菜单,底部栏等,模板不支持多继承,继承的实现需要加上区域块的名称;建议继承语句写在模板页面的顶部;

  2.宏:macro,实现模板页面动态(功能)代码块的封装,类似Python中的函数;

  3.include:实现原始静态页面的完整复用,wtf表单对象不能复用。

21.Flask中的特殊变量和方法:

  config对象:保存配置信息,设置数据库放入连接、SECRET_KEY,config可以导入配置文件,读取配置文件;

  request常用的属性:args / form / data / method / files;

  url_for:反向解析,实现从视图函数找到具体的url,一般用来配合redirect实现页面的重定向;

  return redirect(url_for(视图函数名)):重定向建议使用url_for,简化页面重定向的操作;

  flask消息闪现,在视图中定义提示用户信息,在模板页面中使用循环展示提示信息for  x  in  get_flashed_messages()

22.数据库:

  Flask_SQLAlchemy扩展包

  实力化sqlalchemy对象,需要和应用程序实例进行关联db = sqlalchemy(app)

  首先,需要手动创建数据库,其次,配置数据库的连接和动态追踪修改

  app.config['SQLALCHEMY_DATABASE_URI'] =   'mysql://root:mysql@localhost/database'
  app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True

  在请求过程自动提交数据的设置,在未来版本中会被删除

23.自定义模型类:

  1.继承自db.Model

  2.指定表的名称,建议项目名和表名,单个表名建议使用复数

  3.定义字段,db.Column()指定字段属性约束,主键、外键、唯一、默认值等;

  4.反向引用,us = db.relationship('USER',backre='role');

24.实现一对多或多对一的查询:在数据库中没有具体的字段

  us可以实现多对一的查询

  role可以实现多对一的查询,在多的一方指定外键

  多对多的关系映射,本质就是两个一对多,数据的存储在第三张表

25.db.session数据库会话对象,封装了对数据库的操作

  db.session.add()提交一条数据

  db.session.add_all()提交多条数据

  db.session.create_all()创建表

  db.session.drop_all()删除表

  db.session.rollback()回滚

26. 基本查询:

  User.query.get()接收的参数为主键
  User.query.filter(User.id=user_id)过滤查询,需要指定模型类的类名,需要加上执行器,all()/first()/order_by()
  User.query.filter_by(id=user_id)过滤查询,需要传入字段名进行过滤,需要加上执行器
  and_/or_/in_/notin_与或非
  排序order_by/分页limit/paginate
  更新数据:User.query.filter_by(id=user_id).update({'name':'Lee'})
  

27. 蓝图:

    1.类、模块化应用的容器;延迟创建路由映射
    2.创建蓝图对象:
  api = Blueprint('api',__name__)
     使用蓝图对象:
  @api.route()
    1、可以在创建蓝图对象的文件中使用
    2、可以导入其他文件中,但是需要把其他文件再次导入到当前创建蓝图对象的文件中,需要避免循环导入的问题,交错导入,
    3、注册蓝图路由,在创建应用程序实例的地方,app.register_blueprint(api.url_prefix='/api/v1.0')

28. 单元测试:
    测试的目的:为了检验功能代码预期结果和实际结果的差距
    使用unittest测试模块
    单元测试的书写:本质是断言代码,
  1、自定义测试类,需要继承自unittest.TestCase
  2、测试方法,setUp()方法名不能改变,一般用来定义测试代码执行前的准备工作,包括创建客户端,指定连接数据库,构造程序实例等
  3、测试方法,teatDow()方法名不能改变,一般用来定义测试代码执行后的清除工作,比如清除测试数据,清空缓存等;
  4、测试方法的函数名必须test开头;assert断言测试结果

29. 部署:
    gunicorn -w 开启的进程数 -b 绑定的ip和port 启动文件名:程序实例名
    正向代理:面向客户端,服务器不知道访问的客户是谁
    反向代理:面向服务器:客户端不知道访问的服务器是谁

30. REST ful API设计:
    域名、版本、路径、请求方法、返回结果、状态码、错误信息、过滤信息、数据交互格式、链接相关资源

31. 性能:
    提高用户体验,减少响应时间
    性能优化:web前端优化、web后端优化、存储、运维优化
    后端优化:
  1、使用缓存,可以把大量访问,又不是经常修改的数据放入缓存中,比如项目首页信息
  2、使用异步:封装请求,实现对数据异步操作;
  3、多线程:线程数和硬件条件,以及对服务器的操作类型的不同而不同,IO密集型可以采取多线程的形式提高效率,计算型的任务不适合;
  4、存储优化;

  

  

   

初涉FlaskWeb开发----基础篇的更多相关文章

  1. Android应用开发基础篇(1)-----Button

    Android应用开发基础篇(1)-----Button   一.概述        Button,顾名思义就是按钮的意思,它主要的功能是响应用户按下按钮时的动作. 二.应用      新建一个工程, ...

  2. 【学习记录】第一章 数据库设计-《SQL Server数据库设计和开发基础篇视频课程》

    一.课程笔记 1.1  软件开发周期 (1)需求分析阶段 分析客户的业务和数据处理需求. (2)概要设计阶段 设计数据库的E-R模型图,确认需求信息的正确和完整. /* E-R图:实体-关系图(Ent ...

  3. PHP实现微信公众平台开发—基础篇

    PHP实现微信公众平台开发—基础篇 2 1课程介绍 2 2. 微信公众号账号介绍的申请流程详解 2 2.1微信三角色关系 2 2.2信息流的过程 2 2.4微信公众账号的认证 3 2.5订阅号的申请流 ...

  4. 【COCOS2DX-LUA 脚本开发之一】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途!

    [COCOS2DX-LUA 脚本开发之一]在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途! 分类: [Cocos2dx Lua 脚本开发 ] 2012-04-1 ...

  5. Linux 网络协议栈开发基础篇—— 网桥br0

    一.桥接的概念 简单来说,桥接就是把一台机器上的若干个网络接口"连接"起来.其结果是,其中一个网口收到的报文会被复制给其他网口并发送出去.以使得网口之间的报文能够互相转发. 交换机 ...

  6. iOS开发基础篇-Button基础

    一.简单介绍  UIButton 的功能:响应用户操作.显示文字.显示图片.调整内部图片和文字的位置. 二. UIButton 的状态  UIControlStateNormal :普通状态,为默认情 ...

  7. 2-STM32+W5500+GPRS物联网开发基础篇-基础篇学习的内容

    https://www.cnblogs.com/yangfengwu/p/10936553.html 这次的基础篇为公开篇,将公开所有基础篇的资料和源码 现在说一下基础篇准备公开的内容:(大部分哈,要 ...

  8. 1-STM32+W5500+GPRS物联网开发基础篇-工控板简介

    最近这些日子都在忙活STM+W5500+GPRS的板子,所以前面的那块板子的教程耽搁了些时间. 这次的板子和上一版相比更贴近了使用,是因为有朋友督促我要做一块直接可以在工厂使用的板子,所以设计了这一块 ...

  9. Android应用开发基础篇(3)-----ListView

    一.概述 ListView是一个列表显示控件,它的应用非常广泛,在很多应用程序中都可以看到它的身影,比如来电通,网易新闻等等,特别是QQ.因此非常有必要熟练掌握它. 二.要求 能够利用ListView ...

随机推荐

  1. Tensorflow 报错:tensorflow.python.framework.errors_impl.InternalError: Failed to create session.

    问题描述 IDE:pycharm,环境中安装tensorflow-gpu 1.8.0 ,Cuda9 ,cudnn 7,等,运行代码 报错如下 tensorflow.python.framework.e ...

  2. RTK与差分测量的区别

    差分GPS定位原理 它使用一台 GPS基准接收机(基准站)和一台用户接收机(移动站),利用实时或事后处理技术,就可以使用户测量时消去公共的误差源 —卫星轨道误差.卫星钟差.大气延时.多路径效应.特别提 ...

  3. C# 结构与类的区别

    一.定义方式 定义结构: struct PointStruct //默认的访问权限是 public { public int X { get; set; } public int Y { get; s ...

  4. jqGrid选择列控件向右拖拽超出边界处理

    jqGrid选择列控件向右拖拽超出边界处理 $("#tb_DeviceInfo").jqGrid('navButtonAdd', '#jqGridPager', {         ...

  5. vue中$refs的使用

    vue中$refs获取组件或元素: 获取的元素就相当于是一个原生获取的元素,可以进行操作 this.$refs.ele.style.color = 'red

  6. 使用Notepad++编译运行C/C++/Python程序

    对我来说,比较常用的是C/C++/Python. 使用Notepad++编译运行单个源文件的C/C++/Python,比使用复杂的IDE更加快捷. 想要让Notepad++能够做到编译运行C/C++/ ...

  7. 【算法】祭奠spfa 最短路算法dijspfa

    题目链接 本题解来源 其他链接 卡spfa的数据组 题解堆优化的dijkstra 题解spfa讲解 来自以上题解的图片来自常暗踏阴 使用前向星链表存图 直接用队列优化spfa struct cmp { ...

  8. 一、Git简介

    由于工作需要,代码版本控制工具由SVN换为了Git.Git对于我来说,很陌生,不清楚其工作原理,所以查询了一些资料,将自己所得知的内容来汇总一下,梳理一下这方面的知识,同时也给其他想了解Git的童鞋们 ...

  9. C++中的getline

    https://www.cnblogs.com/ymd12103410/p/9514896.html#undefined

  10. GNOME 系统设置

    详细的GNOME系统设置全文,参见这里. 以下摘录使用到的部分. 1. 在任务栏上显示日期或周几(二选一).秒数 $ gsettings set org.gnome.desktop.interface ...