Django新手求助:如何在requests请求中传递Basic认证头?
如何在Django的requests中传递Basic认证头
嘿,作为从Node/Express转Django的新手,我完全懂你想把熟悉的Axios用法迁移到requests的心情!其实requests处理Basic认证有两种很方便的方式,我给你详细拆解下:
方法1:用requests内置的HTTPBasicAuth(最推荐)
requests已经帮我们封装好了Basic认证的处理,不用手动搞Base64编码,省心又不容易出错。你只需要导入HTTPBasicAuth,然后在请求里传入用户名和密码就行:
from base64 import b64encode import requests import environ from requests.auth import HTTPBasicAuth # 新增这个导入 env = environ.Env() environ.Env.read_env() endpoint = 'some url' def get_api_data(): # 直接把用户名和密码传给HTTPBasicAuth,requests会自动生成认证头 response = requests.get( endpoint, auth=HTTPBasicAuth(env('API_USERNAME'), env('API_PASSWORD')) ) return response.json()
方法2:手动构造请求头(和你Axios的习惯一致)
如果你更习惯像Axios那样手动设置Authorization头,那需要注意headers必须是字典格式,你之前的代码把auth拼成了字符串,这是问题所在。修改后的代码如下:
from base64 import b64encode import requests import environ env = environ.Env() environ.Env.read_env() endpoint = 'some url' credentials = f"{env('API_USERNAME')}:{env('API_PASSWORD')}" # 把bytes类型的编码结果转成字符串 encoded_credentials = b64encode(credentials.encode("utf-8")).decode("utf-8") # 构造字典格式的headers headers = { 'Authorization': f'Basic {encoded_credentials}' } def get_api_data(): # 在请求中传入headers参数 response = requests.get(endpoint, headers=headers) return response.json()
额外技巧:设置全局默认认证(类似Axios的defaults)
如果你的Django服务所有请求都需要这个Basic认证,也可以像Axios设置默认头那样,给requests设置全局的认证信息:
# 方式一:全局默认auth requests.auth = HTTPBasicAuth(env('API_USERNAME'), env('API_PASSWORD')) # 方式二:全局默认headers requests.headers.update({'Authorization': f'Basic {encoded_credentials}'})
设置之后,后续所有的requests.get()、requests.post()等请求都会自动带上认证信息,不用每次都传参数啦~
内容的提问来源于stack exchange,提问作者João Ramires
相关产品推荐
相关产品推荐

