zoukankan      html  css  js  c++  java
  • Flask学习1

    一、安装flask

    pip install flask #需要注意的是,还有flake,那个是检查错误的模块,不要搞混了

    可以看到成功了,总共下载了四个模块,分别是对应的web开发中的模板渲染,网络服务都是一些flask依赖包。

    二、flask的用法

    1.启动

    既然说到用法,那第一个就肯定得说说它是怎么启动的,不然别人哪里还学的下去啊,废话少说,开干。

    from flask import Flask
    app=Flask(__name__) #创建应用实例
    
    @app.route('/')  # route装饰器创建路由
    def hello():  # 访问此路由时执行的视图函数
        return 'hello' # 视图函数的返回值,又叫‘响应’
    if __name__ == '__main__':
        app.run(debug=True) #开始运行flask应用程序,以调试模式运行
        
    #可以设置启动的host地址和端口号,具体方法:
    app.run(host='192.168.1.2',port=3243)

    2.创建Flask应用注意事项

    要想创建一个Flask应用,首先我们要建立一个项目文件夹,里面至少要有两个文件夹,一个存放媒体文件(static),一个存放网页文件(templates),如果Python程序不多,可以不用给它单独建立文件夹。Flask不像Django一样可以自动创建文件夹,需要我们自己创建。如果你想查看flask创建的路由信息:

    url_map存储的是url与endpoint的映射。那么这个endpoint是什么意思了?实际上,当请求传来一个url的时候,会先通过rule找到endpoint,然后再根据endpoint再找到对应的视图函数。通常,endpoint的名字都和视图函数名一样。这里还有一点特别注意,那就是所有的控制台输出信息语句必须写在app.run()之前,否则不起作用。

    3.Flask的妙用

    我们可以看到Flask里面有一个name,这个是为了启动模板专门设立的,除了这个,它还有:

    static_url_path:静态网页地址

    static_folder:静态地址,默认为static文件夹

    template_folder:模板文件夹,默认为templates文件夹

    4.添加配置文件

    1)直接在app.run()函数里添加

    比如以调试模式运行Flask应用就可以使用:app.run(debug=True)

    2)直接配置

    app.config=True

    3)建立配置文件

    在项目文件夹根目录建立一个配置文件夹,名字为 hw.hw,后缀名你随便取,内容为 DEBUG=True,然后在app.run()前面添加app.config.from_pyfile('hw.hw') 即可。

    5.视图函数用法

    1)下级页面

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

    2)转换器

    @app.route('/index/<int:num>') #定义转换器名字num
    def num(num): #将转换器传入函数中
        if num>10: #如果它的值大于10输出dog,小于10输出pig
            return 'dog'
        else:
            return 'pig'

    这里需要说到的是,转换器主要是将页面后的值作为某一个标准来得到另一个页面,我们常看到的加密字符串就是用这个做的,那么它有哪些类型呢?

    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

     可以通过反向解析将添加了自定义转换器的视图函数拿来用,这里需要用到重定向和反向解析:

    @app.route('/search')
    def jj():
        url=url_for('email',email='2091500484@qq.com')
        return redirect(url)

    如果不注明转换器类型,就是默认的字符串型:

    @app.route('/hw/<boy>') 
    def hw(boy):
        return 'boy:%s'%boy

    还可以定义默认的转换器的默认值:

    @app.route('/ha/<string:haid>',defaults={'haid':'hello,boy'}) #设置默认值
    def ha(haid):
        return 'haid:%s'%haid

    3)多个路由指向同一地址

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

    这里访问下级页面1或者页面2都会得出同样的结果’1122‘

    6.重定向

    重定向即是指从一个网页跳转到另一个网页,相当于刷新之后的操作,这里涉及到flask里的两个模块(redirect,url_for)。

    1)直接跳转

    直接跳转到路由下

    from flask import redirect,url_for
    @app.route('/refer')
    def refer():
        return redirect('/1')

    这样就可以直接跳转到路由函数fg中并显示返回值。

    2)间接跳转

    我们可以先访问路由函数,然后跳转到相应内容页面

    @app.route('/ref')
    def ref():
        return redirect(url_for('fg')) #跳转

    这样直接访问ref子页面就可以直接跳转到相应页面了

    7.定义错误页面

    有两种方式,一是使用系统的abort直接赋值,二是使用自定义errorhandler函数。

    1)abort

    直接使用系统自带的错误内容

    @app.route('/use/<id>')
    def get_use(id):
        if int(id)<10:
            abort(404)
        elif int(id)>20:
            return '---Error---'
        return 'hello:%s'%str(id)

    2)errorhandler

    自定义错误页面内容

    @app.errorhandler(404)
    def error(err):
        return 'hello,%s'%err

    3)定义错误页面

    它可以将自定义的错误写入到页面中,平时会用的比较多。

    @app.route('/error1')
    def err1():
        error1=('index error',666,[('key','div'),('value','zero')])
        return error1

     当然还有一种表述方式:

    @app.route('/error2')
    def err2():
        error2=('login error',444,{'serise':'100','dataframe':'200'})
        return error2  

    4)设置请求

    这里需要说到一个新的模块make_response(),当然你也可以使用Response()。

    @app.route('/error3')
    def err3():
        resp=make_response('search error') #这里只需把make_response()换成Response()即可
        resp.status='400'
        resp.headers['hrr']='zjj'
        resp.headers['hw']='zj'
        return resp

    8.json数据读取

    flask中有个非常给力的可以处理json数据的模块,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)

     

    9.cookie的操作

    1)设置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']='Linux' #服务器名称
        return response

    2)获取cookie

    这里需要用到一个模块request,它相当于模拟一个请求,你可以把它当做requests模块一样。

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

    3)删除cookie

    有两种删除方式来删除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

    10.session操作

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

    1)设置session

    一、配置安全秘钥:
    app.config['SECRET_KEY']=os.urandom(30)
    二、设置session字典
    session['user']='hw'
    session['pass']='zj'
    三、设置session过期方式
    session.parmanent=True #默认31天后过期
    #session两个小时过期
    app.config['PERMANENT_SESSION_LIFETIME']= timedelta(hour=2)
    四、综合代码
    @app.route('/session1')
    def session1():
        session['user']='hw'
        session['pass']='zj'
        session.parmanent=True #默认31天后过期
        return 'login success'

    可以看到session成功设置在cookie里面了,并且浏览器也记录了。当然你也可以只设置cookie,不过为了安全建议你设置session。

    2)获取session

    跟cookie获取有点不同。

    一、get()获取
    @app.route('/session2')
    def session2():
        us=session.get("user")
        pa=session.get("pass")
        return 'hello %s %s'%(us,pa)
    二、索引获取

    这种方式如果获取不到值容易产生异常,建议用上一种方法,除非你知道一定能获取到值。

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

    3)删除session

    也有两种方法,不过一种是一个一个删除,另一种则是全部删除。

    一、逐一删除
    @app.route('/session3')
    def session3():
        session.pop('user',None)
        session.pop('pass',None)
        return 'delete successful!!!!'
    二、全部删除
    @app.route('/session4')
    def session4():
        session.clear()
        return 'delete successful!!!!'
  • 相关阅读:
    【转】VS2010中 C++创建DLL图解
    [转]error: 'retainCount' is unavailable: not available in automatic reference counting mode
    [转]关于NSAutoreleasePool' is unavailable: not available in automatic reference counting mode的解决方法
    【转】 Tomcat v7.0 Server at localhost was unable to start within 45
    【转】Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds. If
    【转】SVN管理多个项目版本库
    【转】eclipse安装SVN插件的两种方法
    【转】MYSQL启用日志,和查看日志
    【转】Repository has not been enabled to accept revision propchanges
    【转】SVN库的迁移
  • 原文地址:https://www.cnblogs.com/windyrainy/p/15314932.html
Copyright © 2011-2022 走看看