Cách sử dụng biến từ tập lệnh python này sang tập lệnh khác

Python cung cấp cho bạn khả năng viết một đoạn mã và gọi đoạn mã đó dưới dạng một hàm. Bạn có thể gọi hàm từ trong cùng một tập lệnh nơi hàm được xác định hoặc bạn có thể lưu hàm trong một tập lệnh riêng rồi nhập hàm vào bên trong các tập lệnh khác

Các chức năng viết và gọi là một thành phần chính của nguyên tắc Phát triển phần mềm Don't Repeat Yourself (DRY). Tạo một hàm trong một tập lệnh và gọi hàm đó từ các tập lệnh khác tốt hơn là thực hiện sao chép cùng một đoạn mã trong một số tập lệnh. Khi một chức năng tồn tại trong một tập lệnh duy nhất, nó chỉ cần được cập nhật ở một nơi khi chắc chắn cần cập nhật

Mặc dù các hàm Python có thể thực hiện các tác vụ riêng biệt, nhưng các trường hợp sử dụng thông thường của tôi sẽ gửi giá trị vào hàm và nhận giá trị trả về từ hàm. Trong ví dụ này, tôi sẽ nhập một hàm Python được sử dụng để làm mới mã thông báo truy cập cần thiết để xác thực với điểm cuối API từ xa. Tôi sẽ chuyển các mã thông báo khác cần thiết để làm mới mã thông báo truy cập vào hàm và hàm sẽ trả mã thông báo truy cập đã làm mới về tập lệnh gọi

Chức năng

Tên của tập lệnh và chức năng đặc biệt quan trọng khi chúng tôi phân tích cú pháp qua mã. Chúng tôi đã tạo một tập lệnh Python có tên RefreshBlubrryAccessToken. py. Trong tập lệnh đó, chúng tôi xác định một hàm có tên là tìm nạp

Hàm tìm nạp yêu cầu ba đầu vào được chuyển đến nó–client, clientsecret và refreshtoken. Mặc dù tên của hàm—fetchtoken–quan trọng bởi vì chúng ta sẽ gọi nó trong một tập lệnh khác, nhưng tên của các biến được sử dụng để gán các giá trị đầu vào không quan trọng theo cùng một cách. Các biến không tồn tại bên ngoài chức năng mà chúng được tạo

Hàm sử dụng thư viện yêu cầu để thực hiện lệnh gọi API mã thông báo truy cập làm mới tới Blubrry, sử dụng clientid, clientsecret và refreshtoken để xác thực. Phản hồi cho lệnh gọi HTTP POST API của chúng tôi là một tải trọng JSON và giá trị chính trong tải trọng đó mà chúng tôi quan tâm nhất là 'access_token'. Giá trị này được trả về dưới dạng giá trị được lưu trữ trong biến accessToken

# RefreshBlubrryAccessToken.py

import requests

def fetchtoken(clientid, clientsecret, refreshtoken):

    # From Blubrry's docs, this is how you call for a new access token.
    # https://blubrry.com/developer/api/oauth-2/
    # Use the Refresh token API call to obtain a new access token
    # curl "https://api.blubrry.com/oauth2/token"
    #      -u clientId:clientSecret
    #      -d grant_type=refresh_token
    #      -d refresh_token=refreshToken
    baseURL = 'https://api.blubrry.com/'
    apiURL = 'oauth2/token'
    apiCall = baseURL + apiURL
    apiCallData = {
        'grant_type': 'refresh_token',
        'refresh_token': refreshtoken
    }

    responseFromBlubrry = requests.post(
        apiCall,
        auth=(clientid, clientsecret),
        data=apiCallData
    )

    accessToken = responseFromBlubrry.json()['access_token']
    return accessToken

Chức năng này được đơn giản hóa cho mục đích minh họa. Trong cuộc sống thực, chúng tôi sẽ không cho rằng mình đang nhận lại mã thông báo truy cập hợp lệ. Thay vào đó, chúng tôi sẽ kiểm tra các mã lỗi mà chúng tôi có thể đã nhận lại và xử lý chúng một cách thích hợp. Hãy coi mã này là bằng chứng về khái niệm và chưa sẵn sàng sản xuất

Sử dụng chức năng

Hãy nhớ cách chúng tôi đặt tên hàm ở trên RefreshBlubrryAccessToken. py? . Do đó, khi chúng tôi nói “nhập RefreshBlubrryAccessToken“, tệp sẽ được tìm thấy vì Python bao gồm các tệp liền kề trong phạm vi tìm kiếm nhập của nó

Các giá trị BLUBRRY_CLIENT_ID, BLUBRRY_CLIENT_SECRET và BLUBRRY_REFRESH_TOKEN đã được chuyển vào tập lệnh này từ môi trường hệ điều hành cục bộ

Với hàm được nhập và các biến chính được gán giá trị của chúng, chúng tôi đã thiết lập để gọi hàm. Điều kỳ diệu xảy ra ở dòng cuối cùng của mã thông báo truy cập tập lệnh = Refresh Blubrry AccessToken. tìm nạp (clientID, clientSecret, refreshToken). Đây là những gì dòng đó làm

  1. Tạo một biến gọi là accessToken. Giá trị của accessToken sẽ được đặt thành giá trị được hàm RefreshBlubrryAccessToken trả về. tìm nạp. Nếu bạn xem lại mã chức năng ở trên, thì đó là dòng ở cuối tập lệnh trả về accessToken
  2. Gọi hàm RefreshBlubrryAccessToken. tìm nạp. Chúng tôi đã nhập RefreshBlubrryAccessToken ở trên cùng phải không?
  3. Truyền các giá trị của clientID, clientSecret và refreshToken cho hàm khi chúng ta gọi nó. Trong ví dụ này, hàm sử dụng các giá trị đầu vào này làm thông tin đăng nhập cho điểm cuối API Blubrry
  4. Đã gán giá trị được hàm trả về cho accessToken. Nếu mọi việc suôn sẻ với chức năng của chúng tôi, điều đó có nghĩa là chúng tôi hiện có mã thông báo truy cập mà chúng tôi có thể sử dụng để thực hiện lệnh gọi đến các điểm cuối API khác trong thế giới tuyệt vời của Blubrry

import os
import RefreshBlubrryAccessToken

clientID = os.environ["BLUBRRY_CLIENT_ID"]
clientSecret = os.environ["BLUBRRY_CLIENT_SECRET"]
refreshToken = os.environ["BLUBRRY_REFRESH_TOKEN"]

accessToken = RefreshBlubrryAccessToken.fetchtoken(clientID, clientSecret, refreshToken)

Mặc dù cả mã của hàm và mã của tập lệnh gọi hàm đều sử dụng cùng một tên biến clientID, clientSecret, refreshToken và accessToken, những tên biến đó không nhất thiết phải giống nhau trong cả hai tập lệnh. Biến Python có phạm vi khu vực. Tôi giữ các tên biến giống nhau để dễ đọc

Dù sao thì tại sao lại phải thông qua thông tin xác thực?

Bạn có thể thắc mắc tại sao tôi không nhúng thông tin đăng nhập vào chính chức năng đó. Tại sao phải bận tâm với việc chuyển thông tin đăng nhập từ tập lệnh gọi vào hàm? . Thay vì tìm hiểu sâu hơn về các phạm vi biến để tìm hiểu cách các hàm Python nhận biết (hoặc không) các biến môi trường, tôi đã chọn chỉ chuyển thông tin đăng nhập từ một tập lệnh gọi

Đó là, tôi thực sự nghi ngờ rằng có một cách để hàm được gọi có thể xem các biến môi trường của hệ điều hành đã được đặt. Hoặc nếu không, thì có một số cách thích hợp khác để giải quyết vấn đề chung. Tuy nhiên, tôi đã bị sa lầy khi cố gắng hiểu ý nghĩa của nó. Với tinh thần hoàn thành công việc, tôi đã chọn chuyển các biến môi trường từ tập lệnh gọi

Suy đi tính lại, lựa chọn này dường như là một giải pháp tốt. Mặc dù trường hợp sử dụng hiện tại của tôi là hỗ trợ một khách hàng với một tài khoản Blubrry, nhưng nếu tôi muốn sử dụng chức năng này để hỗ trợ nhiều khách hàng với nhiều tài khoản và bộ thông tin xác thực thì sao?