手把手教你做项目web框架flask篇——基础用法详解(代码片段)

肥学大师 肥学大师     2022-12-07     198

关键词:

导读

今天接着为暑假的项目做准备,最近一直做python类的总结所以我们的项目就从python开始吧,喜欢java的同学也不要气馁,后面也会相应的写一个java类的项目喜欢的同学可以关注一波,暑假跟着敲一敲,也可以先收藏一波等有空的时候拿来练手,好了我们进入正题,喊出口号“不肥身体,肥学问

强调:文章中的内容有不理解或者有毛病的可以留言哦,另外说一下我这只是一篇基础的介绍建议大家还是看看我文章末尾发的资源可以详细了解一下。

为什么用flask

在这里插入图片描述

FLask框架本身只实现了最基本的功能,所以FLask被称为 microFramework(微框架),从代码量上来看,的确如此。但是从工程上来看,这种所谓的“小”,反而带来了更多的便利性。在大型项目里,flaskdjango方便太多。大型的意思是你要自定义admin系统(比如管理员分层,每个管理员都能自定义管理组),复杂的数据库操作,许多许多的跨entity的表单操作及验证等。

丰富的第三方库资源,让你在编写几乎任何类型的程序时都能如鱼得水。操作数据库用FLask-SQLAlchemy,验证表单用Flask-WTF,登录管理用FLask-Login,邮件用Flask-Mail... 所以,Flask和兄弟框架Django比起来,另一个有点就很明显了:灵活。你可以任意选择喜欢的第三方扩展

安装flask

pip install flask

但是这样安装的话有点点慢的,还是建议转战清华源,或者豆瓣源这些镜像

pip install flask -i https://pypi.tuna.tsinghua.edu.cn/simple 

另外还需要提一点的是我们最好在写项目的时候建工程使用虚拟环境这样可以预防一些python包的冲突,另外对于不怎么会建立虚拟环境的同学我会在下面推荐一本书,里面会有详细的教程。

启动flask

from flask import Flask

app=Flask(__name__)#创建一个实例这样 下面有专门讲这个的

@app.route('/') #.route的作用时从实例这里创建路由告诉 Flask 什么样的URL 能触发我们的函数
def hello(): #简单的创建一个函数
    return '你好'

if __name__=='__main__':
    app.run(debug=True)# .run是flask开始运行的语句,里面也有很多参数一般建议使用debug=True,自带的调试总比你自己要好一点
    app.run(host='192.168.1.2',port=3308)# 可加可不加这是对具体host和端口的设置,取决你的默认端口是否被占用

详情看调试器操作:传送门
在这里插入图片描述

flask里name的用处

从上面的程序里面我们可以看出flask里面有个name这个是为了启动模板专门设立的如果你使用单一的模块(如上例),你应该使用 name ,因为模块的名称将会因其作为单独应用启动还是作为模块导入而有不同( 也即是 ‘main’ 或实际的导入名)。这是必须的,这样 Flask 才知道到哪去找模板、静态文件等等,另外还有:

static_folder:静态地址,默认为static文件夹
static_url_path:静态网页地址
template_folder:模板文件夹,默认为templates文件夹

如果这里有点点不理解没关系,最后送的书里面会给详细的解释,让你能自己动手开发项目。也可以先看一下官方文档传送门

转换器和变量规则

要给 URL 添加变量部分,你可以把这些特殊的字段标记为 <variable_name> , 这个部分将会作为命名参数传递到你的函数。规则可以用 <converter:variable_name> 指定一个可选的转换器,转换器主要是将页面后的值作为某一个标准来得到另一个页面,我们常看到的加密字符串就是用这个做

from flask import Flask
 
app = Flask(__name__)
 
 
@app.route('/user/<username>')#定义转换器
def show_user_profile(username):#将转换器传入函数中
    # show the user profile for that user
    return 'User %s' % username
 
 
@app.route('/post/<int:post_id>')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id
 
 
if __name__ == '__main__':
    app.run()


Flask的默认转换器:DEFAULT_CONVERTERS = 
‘default’: UnicodeConverter,
‘string’: UnicodeConverter,any: AnyConverter,
‘path’: PathConverter,int: IntegerConverter,float: FloatConverter,
‘uuid’: UUIDConverter,

下面展示自己定义转换器的方法

class rc(BaseConverter):      
 # 重写父类的属性,定义转换器规则
    def __init__(self,url_map):
        super(rc,self).__init__(url_map)
        #验证QQ邮箱的正则表达式
        self.regex ='[0-9a-zA-Z_]0,19@qq.com'
    #定义视图函数下的返回值
    def to_python(self,value):
        val=value
        return val
    def to_url(self,value):#返回url
        return value
app.url_map.converters['em'] = rc #将自定义的转换器添加到转换器列表中
@app.route('/emm/<em:email>') #加入新的转换器
def email(email):
    return 'email is:%s' % email #返回email

重定向

重定向在web开发也挺重要的,它可以从一个网页跳到另一个网页,相当于刷新之后的操作,对flask而言主要涉及两个模块(redirect,url_for)
先建立一个路由用作后面讲例子

@app.route('/1')
def fg():
    return '1122'

from flask import redirect,url_for
@app.route('/refer')
def refer():
    return redirect('/1')#创建的另外一个路由

这样就可以直接跳转到路由(‘/1’)中的函数中并显示返回值。
我们可以先访问路由函数,然后跳转到相应内容页面这种方式称为间接跳转

@app.route('/ref')
def ref():
    return redirect(url_for('fg')) #跳转这样直接访问ref子页面就可以直接跳转到相应页面了

设置错误页面

大家都知道网页加载避免不了404 等一些错误的,flask有两种方式,一是使用系统的abort直接赋值,二是使用自定义errorhandler函数

  • 使用abort()你可以用 redirect() 函数把用户重定向到其它地方。放弃请求并返回错误代码,用 abort() 函数。这里是一个它们如何使用的例子:
from flask import abort, redirect, url_for
 
@app.route('/')
def index():
    return redirect(url_for('login'))
 
@app.route('/login')
def login():
    abort(401)#401 意味着禁止访问
    this_is_never_executed()
  • 默认情况下,错误代码会显示一个黑白的错误页面。如果你要定制错误页面, 可以使用 errorhandler() 装饰器:
from flask import render_template
 
@app.errorhandler(404)
def page_not_found(error):
    return render_template('page_not_found.html'), 404

注意 render_template() 调用之后的 404 。这告诉 Flask,该页的错误代码是 404 ,即没有找到。默认为 200,也就是一切正常。

json数据读取

json作为通用的数据传输格式其实用性还是比较高的,flask作为web框架对它当然也有一定的处理能力,目前是使用jsonify


@app.route('/json1')
def json1():
    data='name':'HW','first':'ZJ'
    return jsonify(data)


@app.route('/json2')
def json2():
    return jsonify(hour=12,second=21)

在这里插入图片描述

cookie和session

session里面保留的就是会话内容,它存在于cookie当中,通过它我们可以直接登陆某些已经登陆过的系统。要想操作session我们需要引入为它专门准备的session模块,还有需要配置安全秘钥才可以使用session
先来说一下cookie的操作


cookie的设置
set_cookie(key, value='', max_age=None, expires=None,path='/', domain=None, secure=False, httponly=False,samesite=None)

key:键
value:值
max_age:设置过期时间(秒)
expires:设置过期时间,时间戳的形式(1970离现在的时间)
path:当前主域名
domain:子域名
#设置cookie和headers
@app.route('/set_cookie')
def set_cookie():
    response=make_response('cookie设置成功')
    #cookie有效时长30天也可以是hour second minute
    time=datetime.datetime.today()+datetime.timedelta(days=30)#设置cookie的有效时长
    response.set_cookie('user','admin',expires=time) #设置用户名的cookie
    response.set_cookie('pass','123456',expires=time) #设置密码的cookie
    response.headers['X-Something']='mything' #这里不允许出现中文
    response.headers['Server']='feixue' #服务器名称
    return response

在这里插入图片描述

对cookie的获取和删除

获取cookie需要加request模块可不是爬虫的requests


@app.route('/get_cookie')
def get_cookie():
    name="用户名:"+request.cookies.get('user')+"密码:"+request.cookies.get('pass')
    return name

在这里插入图片描述
删除cookie有两种方式
1·通过设置通过设置cookie过期时间为0即可删除


@app.route('/del_cookie1')
def del_cookie1():
    response=make_response('delete cookie 1')
    response.set_cookie('user','',expires=0)
    response.set_cookie('pass','',expires=0)
    return response

2.直接删除cookie

@app.route('/del_cookie2')
def del_cookie2():
    response=make_response('delete cookie 2')
    response.delete_cookie('user')
    response.delete_cookie('pass')
    return response

使用基于 cookie 的会话需注意: Flask 会将你放进会话对象的值序列化至 Cookies。如果你发现某些值在请求之间并没有持久存在,然而确实已经启用了 Cookies,但也没有得到明确的错误信息。这时,请检查你的页面响应中的 Cookies 的大小,并与 Web 浏览器所支持的大小对比。

session操作

设置session
配置安全密钥
随机的问题在于很难判断什么是真随机。一个密钥应该足够随机。你的操作系统可以基于一个密钥随机生成器来生成漂亮的随机值,这个值可以用来做密钥:


app.config['SECRET_KEY']=os.urandom(30)

设置session字典


session['user']='fei'
session['pass']='xue'

设置session过期方式


session.parmanent=True #默认31天后过期
#session两个小时过期
app.config['PERMANENT_SESSION_LIFETIME']= timedelta(hour=2)

合起来就是

@app.route('/session1')
def session1():
    session['user']='fei'
    session['pass']='xue'
    session.parmanent=True #默认31天后过期
    return 'login success'

获取session
get()获取和索引获取,索引获取不太稳定还是建议用get方法


@app.route('/session')
def session2():
    us=session.get("user")
    pa=session.get("pass")
    return 'hello %s %s'%(us,pa)

删除session
逐一删除


@app.route('/session')
def session3():
    session.pop('user',None)
    session.pop('pass',None)
    return 'delete successful!'

全删


@app.route('/session4')
def session4():
    session.clear()
    return 'delete successful!'

request的使用

在上面获取cookie有提到request,下面我们来特意讲一下关于request的使用这是一个专门用来操作网页请求的模块。
requestget请求

可通过设置它的methods参数来指定请求方式。

@app.route('/get', methods = ['GET','POST'])
def get():
    if request.method == 'GET':
        return '这是一个GET请求'
    else:
        return '这是一个其它请求'

post请求

@app.route('/post', methods = ['POST','GET'])
def post():
    if request.method == 'POST':
        return '这是一个POST请求'
    else:
        return '这是一个其它请求'

request的args

记录get请求中的查询参数,一般用于查询,搜索网址

https://www.kugou.com/yy/html/search.html#searchType=song&searchKeyWord=你的名字
它会返回get请求中的参数,比如请求上面的url,它的请求参数便是:

searchType=song&searchKeyWord=你的名字
使用方法:

request.args['keyword']
request.args.get('keyword')

requestform
记录请求中的表单数据,一般用于表单提交。比如我们注册网站时经常需要进行表单提交。

我们可以使用获取表单中的内容:

request.form['keyword']
request.form.get('keyword')

requestheaders

返回请求网页头部信息,返回一个列表。

request.headers['keyword']
request.headers.get('keyword')

蓝图开发必备

这个知识一看就会
下面这个程序的存放文件叫fei.py

from flask import Flask
app=Flask(__name__)
@app.route('/kj')
def df():
    return 'hello world'
@app.route('/index')
def lk():
    return 'efhsfj'

于是就有

from flask import Flask,request
from fei import *
@app.route('/')
def login():
    return request.url
if __name__ == '__main__':
    app.run(debug=True)

看出来了吧,就是从主文件调用此文件里面的功能蓝图的精髓无非就是将多个模块引入到一个主模块中使用,相当于我们自己在写模块并把它当到蓝图中供调用。多个蓝图中如果有相同方法可用蓝图视图函数来区分各自的方法。

视图

视图可大家理解的视图意思差不多,比如mysql数据库中的视图,道理其实都是互通的,并不会有太大的差别,只是功能不一样罢了。创建视图的方式也很简单,都继承自flask的views类。
类的视图

from flask.views import View
def ff():
    return 'ok'
class st(View):
    def dispatch_request(self): #必须实现这个方法
        return "任性的90后boy"
# 类视图通过add_url_rule方法和url做映射
app.add_url_rule(rule='/ff',view_func=st.as_view('tt'))

方法的

from flask.views import MethodView
def gg():
    return 'ok'
class login(MethodView):
    #当客户端通过get方法进行访问的时候执行的函数
    def get(self):
        return 'get'
    # 当客户端通过post方法进行访问的时候执行的函数
    def post(self):
        email = request.form.get("user")
        password = request.form.get("pass")
        if user== 'gffsadff' and pass== '4fsaferwf':
            return "登录成功"
        else:
            return "登陆失败"

# 通过add_url_rule添加类视图和url的映射,并且在as_view方法中指定该url的名称,方便url_for函数调用
app.add_url_rule('/gg',view_func=login.as_view('lg'))

资源分享

跟上次MySQL篇一样为了让大家可以更好的学习,也给大家找了一些资源flask web开发基于python如果大家想学学看的话就到我的主页找一下资源吧当然也可以私信我。最后给大家分享一下我最近特别喜欢的图片,欢迎大家三连支持哦

在这里插入图片描述

链接:手把手教你做项目系列欢迎订阅

手把手教你做项目mysql篇——从下载到命令总结(代码片段)

目录导读下载MySQL篇基础命令篇操作前的提示登录篇对数据库命令操作篇对表的操作删除表(这个单独说一下)对数据操作篇结尾送书导读有段时间没有好好整理文章了,这不是又该暑假啦嘛肥学准备在暑假来波大的&... 查看详情

手把手教你做javaweb项目:登录模块

现如今,无论是客户端还是移动端,无论是电动登陆还是社交平台登陆,无处不在的“登陆”。那么你知道怎么制作吗?今天就为你娓娓道来:用户登录在各大信息管理系统中,登录功能是必不可少的,他的作用就是验证用户的身... 查看详情

《手把手教你》系列基础篇(七十二)-java+selenium自动化测试-框架设计基础-testng简单介绍(详解教程)(代码片段)

1.简介前面文章细心的小伙伴会发现宏哥在运行测试用例的时候有的是在main方法下,而有的不需要用main方法去执行用例,那么为什么有的就不需要在main方法下就能够成功运行测试用例了。这就需要单元测试框架的支持,这篇宏... 查看详情

手把手教你做产品经理

课程目录:001说在前面的话002我的互联网观003与你息息相关的未来004我们应该如何让学习更有效率005我们应该如何让学习更有效率006真实产品案例-案例学习重点与项目背景007真实产品案例-大讨论与项目定调008真实产品案例-用户... 查看详情

手把手教你做蓝牙小车

第1节选择Arduino开发板1.1Arduino是什么对Arduino,官方有一堆解释。作为一个软件程序猿,在我眼里,Arduino是学习“可怕硬件”的一个便捷通道。它把复杂的硬件名称,属性给我们隐藏起来,只需要一些简单的软件知识,就可以学... 查看详情

手把手教你做一个缓存工具(代码片段)

日常开发中,某些数据接口即使优化到极致,都难免还会存在计算量巨大导致响应过慢,多数情况单独做一个统计表用于存放这些处理后的数据用于读取,或者接入redis/memcache存数据,就是说单次响应本身是可以接受较慢一些的... 查看详情

csdn博客太火了也教你做一个——(期末web大作业)(代码片段)

...前端知识介绍最后对肥友说资料领取和详解展示整个项目手把手教你开发一个博客系统-2021-10-1408:26:10进入巨幕主面板左边给大家留出以下空间等学会了以后可以自己加一下图标或者展示一些其他功能。导读不光是这次博客系统&#... 查看详情

《手把手教你》系列基础篇(七十三)-java+selenium自动化测试-框架设计基础-testng实现启动不同浏览器(详解教程)(代码片段)

1.简介上一篇文章中,从TestNg的特点我们知道支持变量,那么我们这一篇就通过变量参数来启动不同的浏览器进行自动化测试。那么如何实现同时启动不同的浏览器对脚本进行测试,且听我娓娓道来。2.项目实战2.1创... 查看详情

手把手教你做安豆计算器-开发环境搭建与部署

...0到1的过程让新手们抓狂。于是我们写了这篇操作性强,手把手教你应用开发的教程,帮助准备开始学习安卓应用开发的同学。万事开头难,把开始的第一只拦路虎解决掉,以后的路就越走越宽了。本文将从一个实用的例子-“... 查看详情

手把手教你做一个电子相册(代码片段)

1、概述首先介绍下什么是HaaS:2020年9月17日,在云栖大会上阿里云IoT团队正式发布了HaaS(HardwareasaServie)。HaaS是一种物联网设备云端一体开发框架,它的目的是通过数量收敛的硬件积木(比如主控板:... 查看详情

万字干货:手把手教你做需求管理

通过这篇文章,总结自己在工作实践中需求管理的方法论——普拉姆方法。总结这个方法论的特点是,用最轻量化的投入,与他人协作,并管理需求,推动需求上线。这套方法论组合了项目管理、敏捷开发的知识,希望能对大家... 查看详情

手把手教你数据恢复编程基础知识篇

好了。接上一篇,本篇,我们将详细讲解NTFS文件系统的一些重要的数据结构,闲话少叙,咱们开讲。NTFS文件系统一、NTFS简介NTFS(NewTechnologyFileSystem)文件系统是微软公司同时和WindowsNT(NewTechnology࿰... 查看详情

手把手教你做安豆计算器-计算器界面布局

第3节计算器界面布局现在起,我们就开始正式开发“计算器”应用。这一节,我们将完成计算器的界面布局,让它初具计算器的模样。计算器界面是通过布局文件定义的。它位于项目的reslayoutactivity_main.xml文件中。这个布局文件... 查看详情

flask框架基础篇(代码片段)

Flask是一个使用Python语言编写的轻量Web开发级框架--"麻雀虽小,五脏俱全"。flash两大核心:基于Werkzeug的路由模块,基于Jinja2模板引擎。中文文档:http://docs.jinkan.org/docs/flask/虚拟环境配置参照中文文档:下面通过在代码里... 查看详情

手把手教你做爬虫---基于nodejs

前言:趁着北京今儿天气格外的蓝,我觉得我得干点什么,于是乎,卷起袖子,整理一下最近做爬虫的那些事儿。目标:爬取北京大学软件与微电子学院的所有新闻,并将内容及图片存储到本地。设计思路:经过对北京大学软件... 查看详情

flask--基础篇

flask简介:flask是一轻量级的web应用框架,它的实现是一个wsgi的微("Micro")框架,当然微("Micro")也不意味这它的功能存在不足,它的核心代码保持简单和扩展性,Flask没有默认使用的数据库、窗体验证工具。然而,Flask保留了... 查看详情

uwpjenkins+nuget+msbuild手把手教你做自动uwpbuild和appstore包

背景项目上需要做UWP的自动安装包,在以前的公司接触的是TFS来做自动build。公司要求用Jenkins 来做,别笑话我,之前还真不晓得这个东西。会的同学请看一下支持错误,不会的同学请先自行脑补,我们一步一步的来。首先我... 查看详情

axure-手把手教你做汉化

 ?我们默认下载的AXURE是英文版的,对于英文能力不足或者不习惯英文界面的,那必须使用汉化手段,网上也有很多朋友已经为大家做好了汉化文件,这里介绍一下如何自己做AXURE的汉化。如何开始汉化如何开始汉化,只需要... 查看详情