尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Flask入门教程(二十四):请求对象API——获取客户端数据的完整指南

Flask入门教程(二十四):请求对象API——获取客户端数据的完整指南 1. 常用属性速查属性类型说明示例值methodstrHTTP请求方法GET、POSTpathstrURL路径部分不含域名和查询字符串/searchfull_pathstr路径 查询字符串/search?qrunooburlstr完整请求URLhttp://localhost:5000/search?qrunoobbase_urlstrURL去掉查询字符串http://localhost:5000/searchurl_rootstr域名 应用根路径http://localhost:5000/hoststrHost头含端口localhost:5000host_urlstrscheme host 应用根http://localhost:5000/schemestr协议http、httpsremote_addrstr客户端IP地址127.0.0.1endpointstr匹配到的路由endpointindex、blog.showurl_ruleRule匹配到的路由规则对象Werkzeug Rule实例view_argsdictURL中的动态变量{post_id: 42}blueprintstr当前蓝图名称auth、blogis_jsonbool请求Content-Type是否为JSONTrue/False2. 获取请求数据属性/方法类型说明argsMultiDictURL查询参数formMultiDictPOST表单数据jsondict/NoneJSON请求体已解析databytes原始请求体数据filesFileMultiDict上传的文件cookiesdict客户端发来的CookieheadersHeaders请求头get_json(forceFalse, silentFalse, cacheTrue)—解析JSON请求体获取查询参数argsfrom flask import request app.route(/search) def search(): keyword request.args.get(q, ) page request.args.get(page, 1, typeint) return f搜索: {keyword}, 第{page}页获取表单数据formapp.route(/login, methods[POST]) def login(): username request.form.get(username, ) password request.form.get(password, ) return f用户: {username}获取JSON数据json / get_jsonapp.post(/api/user) def create_user(): # 方式一直接使用 request.json data request.json name data.get(name, unknown) if data else unknown # 方式二使用 get_json() data request.get_json() if data: name data.get(name, unknown) return {name: name}获取上传的文件filesfrom werkzeug.utils import secure_filename app.route(/upload, methods[POST]) def upload(): if file not in request.files: return 没有文件, 400 file request.files[file] if file.filename : return 文件名为空, 400 filename secure_filename(file.filename) file.save(fuploads/{filename}) return f文件 {filename} 上传成功获取Cookiecookiesapp.route(/profile) def profile(): theme request.cookies.get(theme, light) return f当前主题: {theme}获取请求头headersapp.route(/info) def info(): user_agent request.headers.get(User-Agent, ) referer request.headers.get(Referer, ) accept request.headers.get(Accept, ) return fUser-Agent: {user_agent}3. 内容协商属性属性/方法说明accept_mimetypes客户端接受的MIME类型列表accept_charsets客户端接受的字符集accept_encodings客户端接受的编码方式accept_languages客户端接受的语言content_type请求的Content-Typecontent_length请求体长度字节app.route(/negotiate) def negotiate(): # 获取客户端首选语言 best_lang request.accept_languages.best # 判断客户端是否接受JSON accepts_json request.accept_mimetypes.best application/json return {best_language: best_lang, accepts_json: accepts_json}4. 常用MultiDict操作request.args和request.form都是MultiDict类型支持一个键对应多个值# 获取单个值推荐 request.args.get(key, default) # 返回第一个值不存在返回默认值 # 获取所有值 request.args.getlist(key) # 返回所有值的列表 # 检查是否存在 key in request.args # 返回True/False # 遍历所有键 for key in request.args: print(key, request.args.get(key)) # 转换为普通dict request.args.to_dict() # 只保留第一个值 request.args.to_dict(flatFalse) # 保留所有值5. 请求对象完整示例from flask import Flask, request, jsonify app Flask(__name__) app.route(/api/demo, methods[GET, POST, PUT, DELETE]) def demo(): # 请求方法 method request.method # URL信息 path request.path full_path request.full_path url request.url remote_ip request.remote_addr # 查询参数 q request.args.get(q, ) # 表单数据 username request.form.get(username, ) # JSON数据 data request.get_json(silentTrue) # 非JSON时返回None不抛异常 name data.get(name) if data else None # 文件上传 uploaded_file None if avatar in request.files: file request.files[avatar] if file.filename: from werkzeug.utils import secure_filename uploaded_file secure_filename(file.filename) # Cookie theme request.cookies.get(theme, light) # 请求头 user_agent request.headers.get(User-Agent, ) accept_lang request.headers.get(Accept-Language, ) return jsonify({ method: method, path: path, full_path: full_path, url: url, remote_ip: remote_ip, query: q, username: username, json_name: name, uploaded_file: uploaded_file, theme: theme, user_agent: user_agent, accept_language: accept_lang, is_json: request.is_json, content_type: request.content_type, endpoint: request.endpoint, view_args: request.view_args, })6. 请求对象API速查表类别属性/方法说明基本信息method、path、url、remote_addr请求基础信息查询参数request.args.get(key, default)GET参数表单数据request.form.get(key, default)POST表单JSON数据request.json、request.get_json()JSON请求体原始数据request.data原始请求体文件上传request.files.get(key)上传文件Cookierequest.cookies.get(key)客户端Cookie请求头request.headers.get(key)请求头内容协商request.accept_languages.best客户端偏好7. 常见错误与最佳实践❌ 错误做法✅ 正确做法request.args[key]KeyErrorrequest.args.get(key, default)不检查request.files是否存在先判断file in request.files不检查file.filename是否为空判断if file.filename ! 直接使用上传的文件名使用secure_filename()处理不判断request.is_json直接用request.json用request.get_json(silentTrue)小结本章全面讲解了Flask请求对象的完整API。request代理对象提供了method、path、url、remote_addr等基础信息属性获取客户端数据通过argsURL查询参数、formPOST表单、json/get_json()JSON请求体、files上传文件、cookies和headers内容协商属性包括accept_languages、accept_mimetypes等对于MultiDict类型推荐使用.get(key, default)方法安全获取值。熟练掌握请求对象的API是正确处理客户端输入的基础。
返回列表