簡體   English   中英

flask_login - current_user

[英]flask_login - current_user

我在我的燒瓶應用程序中使用flask_login擴展名來登錄用戶。 您必須知道,此擴展程序有一個存儲current_user的變量。 代碼工作正常,除了測試它。

當我測試代碼時(使用unittest ),我注冊了一個“測試用戶”並將其登錄。但是current_user變量並沒有讓用戶保持登錄狀態。

這是我的應用代碼; 添加類別的部分(當用戶登錄時設置current_user ):

def post(self):
    # Get the access token from the header
    auth_header = request.headers.get('Authorization')
    access_token = auth_header.split(" ")[1]

    if access_token:
        # Attempt to decode the token and get the User ID
        user_id = User.decode_token(access_token)
        if not isinstance(user_id, str):
            # Go ahead and handle the request, the user is authenticated
            data = request.get_json()
            if data['name']:
                category = Category(name = data['name'], user_id = user_id)

                db.session.add(category)
                db.session.commit()

                response = {'id' : category.id,
                    'category_name' : category.name,
                    'created_by' : current_user.first_name
                }

                return response

        else:
            # user is not legit, so the payload is an error message
            message = user_id
            response = {
                'message': message
            }
            return response

這是我測試應用程序的代碼:

import unittest
import os
import json
import app
from app import create_app, db


class CategoryTestCase(unittest.TestCase):
    """This class represents the Category test case"""

    def setUp(self):
        """setup test variables"""
        self.app = create_app(config_name="testing")
        self.client = self.app.test_client
        self.category_data = {'name' : 'Yummy'}

        # binds the app with the current context
        with self.app.app_context():
            #create all tables
            db.session.close()
            db.drop_all()
            db.create_all()

    def register_user(self, first_name='Tester', last_name='Api', username='apitester', email='tester@api.com', password='abc'):
        """This helper method helps register a test user"""
        user_data = {
            'first_name' : first_name,
            'last_name' : last_name,
            'username' : username,
            'email' : email,
            'password' : password
        }

        return self.client().post('/api/v1.0/register', data=json.dumps(user_data), content_type='application/json')

    def login_user(self, email='tester@api.com', password='abc'):
        """this helper method helps log in a test user"""
        user_data = {
            'email' : email,
            'password' : password
        }

        return self.client().post('/api/v1.0/login', data=json.dumps(user_data), content_type='application/json')

    def test_category_creation(self):
        """Test that the Api can create a category"""
        self.register_user()
        login_result = self.login_user()

        token = json.loads(login_result.data)
        token = token['access_token']

        # Create a category by going to that link
        response = self.client().post('/api/v1.0/category', headers=dict(Authorization="Bearer " + token), data=json.dumps(self.category_data), content_type='application/json')
        self.assertEquals(response.status_code, 201)

您需要使用與登錄時相同的上下文。所以這是您需要在代碼中添加的內容:

with self.client() as c:

然后使用c來制作獲取,發布或任何其他您想要的請求。 這是一個完整的例子:

import unittest
from app import create_app

class CategoryTestCase(unittest.TestCase):
    """This class represents the Category test case"""

    def setUp(self):
        """setup test variables"""
        self.app = create_app(config_name="testing")
        self.client = self.app.test_client

        self.category_data = {'name' : 'Yummy'}

    def test_category_creation(self):
        """Test that the user can create a category"""
        with self.client() as c:
            # use the c to make get, post or any other requests
            login_response = c.post("""login the user""")

            # Create a category by going to that link using the same context i.e c
            response = c.post('/api/v1.0/category', self.category_data)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM