zoukankan      html  css  js  c++  java
  • flask验证登录学习过程(1)---实践flask_jwt

    flask_jwt应用代码:

    from flask import Flask
    from flask_jwt import JWT,jwt_required,current_identity
    from werkzeug.security import safe_str_cmp
    import json
    
    class User(object):
        def __init__(self,id,username,password):
            self.id = id
        self.username = username
        self.password = password
        
        def __str__(self):
        return "User(id='%s')"% self.id
    
    users = [
        User(1,'user1','abcxyz'),
        User(2,'user2','abcxyz'),
    ]
    username_table = {u.username: u for u in users}
    userid_table = {u.id: u for u in users}
    
    def authenticate(username,password):
        user = username_table.get(username, None)
        if user and safe_str_cmp(user.password.encode('utf-8'),password.encode('utf-8')):
        return user
    
    def identity(payload):
        user_id = payload['identity']
        return userid_table.get(user_id, None)
    
    app = Flask(__name__)
    app.debug = True
    app.config['SECRET_KEY'] = 'super-secret'
    
    jwt = JWT(app, authenticate, identity)
    
    @app.route('/protected')
    @jwt_required()
    def protected():
        print "this protected is successed!!!"
        return '%s' % current_identity
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0',port=5000)

    应用代码主要是根据官方文档来的

    发送post请求(也可以用浏览器插件如postman来,但是我自己的用了插件总是报401错误,所以自己写请求试)

    import requests
    headers={
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
        "Accept-Encoding": "gzip,deflate, lzma, sdch",
        "Accept-Language": "zh-CN,zh;q=0.8",
        "Content-Type": "application/json",
        "Connection": "keep-alive",
        "Host": "localhost:5000",
        "pgrade-Insecure-Requests": "1",
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36 OPR/33.0.1990.43"
    }
    data = {
        "username":"user1",
        "password":"abcxyz"
    }
    url = 'http://127.0.0.1:5000/auth'
    r = requests.post(url,data=data)
    
    print r.json()

    这个是发送请求,打印出返回的access-token

    应该请求:

    import requests
    headers={
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
        "Accept-Encoding": "gzip,deflate, lzma, sdch",
        "Accept-Language": "zh-CN,zh;q=0.8",
        "Content-Type": "application/json",
        "Connection": "keep-alive",
        "Host": "localhost:5000",
        "pgrade-Insecure-Requests": "1",
        "Authorization": u"JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZGVudGl0eSI6MSwiaWF0IjoxNTE1NjYzNzY2LCJuYmYiOjE1MTU2NjM3NjYsImV4cCI6MTUxNTY2NDA2Nn0.2Ij36x46dfPLnAWGcdJDc-mC0GO6Q6EcMGul7YE3my4", #应用请求到的token信息
        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36 OPR/33.0.1990.43"
    }
    data = {
        "username":"user1",
        "password":"abcxyz"
    }
    url = 'http://127.0.0.1:5000/protected'
    r = requests.get(url,headers=headers,data=data) #请求时,需要加headers,请求方法可以自己定义,但是官方文档上protected路径的请求方法好像默认为get,在定义时改为post方法,并在此处发post请求时,依然报405错误
    
    print r.json()
    

    会在服务端看到200的状态码,请求成功

    总结:当然这个学习过程也不是一帆风顺的,例如

    发送请求之后,一直报“”nonetype“”错误,说对象没有get属性,
    经过排查发现,是获取到请求数据为空,然后自己在源码上修改为data=request.form.to_dict()
    直接将请求的数据获取到,然后才请求成功生成access-token。

    当然这个过程是实现了,,,但是还有很多的疑问没有弄的非常清楚,在问光耀问题的时候,
    听光耀说,这个是因为自己对HTTP的基本原理不熟悉,还需要加强这一块的基础知识。所以今天特意买了书
    希望能补上自己这块的不足之处。

  • 相关阅读:
    css 中calc无效属性值问题
    Junit4 java.lang.Exception: No runnable methods
    javascript 中如何判断是否是JSON格式的字符串
    mybatis 主键UUID生成策略
    过滤器中获取返回信息
    拦截器过滤器以及serverRequest
    Controller中返回数据总结(ResponseEntity,@ResponseBody,@ResponseStatus)
    关于spring cloud接口参数的注意事项
    打印控件lodoop
    window查询端口和进程使用情况
  • 原文地址:https://www.cnblogs.com/wangzhao2016/p/8274944.html
Copyright © 2011-2022 走看看