testcoder-ui commited on
Commit
979ef78
·
1 Parent(s): 3e98433

Fix OAuth login: improve username detection and fix Gradio 6.0 theme parameter

Browse files
Files changed (1) hide show
  1. app.py +57 -18
app.py CHANGED
@@ -213,23 +213,58 @@ def check_user_access(request: gr.Request) -> Tuple[str, bool]:
213
  return "", False
214
 
215
  # 获取登录用户名
216
- # 在 Hugging Face Space 中,用户名可能在不同的属性中
217
  username = None
218
- if hasattr(request, 'username'):
 
 
219
  username = request.username
220
- elif hasattr(request, 'client') and hasattr(request.client, 'username'):
 
 
 
221
  username = request.client.username
 
 
 
 
 
 
 
 
 
 
 
 
222
  elif hasattr(request, 'headers'):
223
- # 尝试从 headers 中获取
224
- auth_header = request.headers.get('authorization', '')
225
- if auth_header:
226
- # 这里可能需要解析 JWT token,简化处理
227
- pass
 
 
 
 
 
 
 
 
 
228
 
229
- # 如果 Space 启用了 OAuth,可以通过环境变量获取
230
  if not username:
231
- # 在 HF Space 中,可以通过环境变量获取
232
  username = os.getenv('HF_USERNAME', '')
 
 
 
 
 
 
 
 
 
 
233
 
234
  if not username:
235
  return "", False
@@ -449,15 +484,16 @@ def submit_evaluation(
449
  return f"❌ 提交评分失败: {str(e)}"
450
 
451
 
452
- def get_user_info(request: gr.Request) -> str:
453
  """获取用户信息"""
 
454
  if not request:
455
- return " 请登录 Hugging Face 账户"
456
 
457
  username, has_access = check_user_access(request)
458
 
459
  if not username:
460
- return "❌ 请登录 Hugging Face 账户\n\n提示:在 Space Settings 中启用 OAuth 登录"
461
 
462
  calls_today = dataset_manager.get_user_calls_today(username) if dataset_manager else 0
463
  remaining = max(0, MAX_DAILY_CALLS - calls_today)
@@ -467,7 +503,7 @@ def get_user_info(request: gr.Request) -> str:
467
 
468
 
469
  # 创建 Gradio 界面
470
- with gr.Blocks(title="Video Model Evaluator", theme=gr.themes.Soft()) as demo:
471
  gr.Markdown("""
472
  # 🎬 视频生成模型评估系统
473
 
@@ -615,11 +651,13 @@ with gr.Blocks(title="Video Model Evaluator", theme=gr.themes.Soft()) as demo:
615
  )
616
 
617
  # 页面加载时更新用户信息
618
- # 注意:在 Gradio 4.x 中,需要使用正确的 request 参数
 
619
  demo.load(
620
- fn=get_user_info,
621
  inputs=[],
622
- outputs=[user_info]
 
623
  )
624
 
625
  # 添加说明
@@ -642,6 +680,7 @@ if __name__ == "__main__":
642
  demo.launch(
643
  server_name="0.0.0.0",
644
  server_port=7860,
645
- share=False
 
646
  )
647
 
 
213
  return "", False
214
 
215
  # 获取登录用户名
216
+ # 在 Hugging Face Space 中,OAuth 登录后用户名可能在多个地方
217
  username = None
218
+
219
+ # 方法1: 直接从 request.username 获取(Gradio 6.0)
220
+ if hasattr(request, 'username') and request.username:
221
  username = request.username
222
+ logger.info(f"从 request.username 获取用户名: {username}")
223
+
224
+ # 方法2: 从 request.client.username 获取
225
+ elif hasattr(request, 'client') and hasattr(request.client, 'username') and request.client.username:
226
  username = request.client.username
227
+ logger.info(f"从 request.client.username 获取用户名: {username}")
228
+
229
+ # 方法3: 从 cookies 中获取(HF OAuth 可能设置 cookie)
230
+ elif hasattr(request, 'cookies'):
231
+ # 检查常见的 HF cookie 名称
232
+ for cookie_name in ['hf_user', 'username', 'user', 'hf_username']:
233
+ if cookie_name in request.cookies:
234
+ username = request.cookies[cookie_name]
235
+ logger.info(f"从 cookie {cookie_name} 获取用户名: {username}")
236
+ break
237
+
238
+ # 方法4: 从 headers 中获取(HF OAuth 常用方式)
239
  elif hasattr(request, 'headers'):
240
+ # HF OAuth 通常在 headers 中设置 X-User
241
+ header_value = None
242
+ for header_name in ['X-User', 'x-user', 'X-HF-User', 'x-hf-user', 'X-Username', 'x-username']:
243
+ if header_name in request.headers:
244
+ header_value = request.headers[header_name]
245
+ logger.info(f"从 header {header_name} 获取: {header_value}")
246
+ username = header_value
247
+ break
248
+
249
+ # 如果没有找到,尝试从 authorization header 解析
250
+ if not username and 'authorization' in request.headers:
251
+ auth_header = request.headers.get('authorization', '')
252
+ logger.info(f"找到 authorization header: {auth_header[:50]}...")
253
+ # 这里可以解析 JWT token 获取用户名(如果需要)
254
 
255
+ # 方法5: 从环境变量获取(如果 Space 设置了)
256
  if not username:
 
257
  username = os.getenv('HF_USERNAME', '')
258
+ if username:
259
+ logger.info(f"从环境变量 HF_USERNAME 获取用户名: {username}")
260
+
261
+ # 调试:打印 request 对象的所有属性
262
+ if not username:
263
+ logger.warning("无法获取用户名,request 对象属性:")
264
+ if hasattr(request, '__dict__'):
265
+ logger.warning(f"request.__dict__: {request.__dict__}")
266
+ logger.warning(f"request 类型: {type(request)}")
267
+ logger.warning(f"request dir: {[attr for attr in dir(request) if not attr.startswith('_')]}")
268
 
269
  if not username:
270
  return "", False
 
484
  return f"❌ 提交评分失败: {str(e)}"
485
 
486
 
487
+ def get_user_info(request: gr.Request = None) -> str:
488
  """获取用户信息"""
489
+ # 如果没有 request,返回提示
490
  if not request:
491
+ return " 正在检查登录状态..."
492
 
493
  username, has_access = check_user_access(request)
494
 
495
  if not username:
496
+ return "❌ 请先登录 Hugging Face 账户\n\n提示:点击右上角的 'Login with Hugging Face' 按钮登录"
497
 
498
  calls_today = dataset_manager.get_user_calls_today(username) if dataset_manager else 0
499
  remaining = max(0, MAX_DAILY_CALLS - calls_today)
 
503
 
504
 
505
  # 创建 Gradio 界面
506
+ with gr.Blocks(title="Video Model Evaluator") as demo:
507
  gr.Markdown("""
508
  # 🎬 视频生成模型评估系统
509
 
 
651
  )
652
 
653
  # 页面加载时更新用户信息
654
+ # 注意:demo.load 可能无法获取 request,所以先显示提示
655
+ # 用户操作时会自动更新(通过 generate_btn 点击事件)
656
  demo.load(
657
+ fn=lambda: "⏳ 请先登录 Hugging Face 账户",
658
  inputs=[],
659
+ outputs=[user_info],
660
+ show_progress=False
661
  )
662
 
663
  # 添加说明
 
680
  demo.launch(
681
  server_name="0.0.0.0",
682
  server_port=7860,
683
+ share=False,
684
+ theme=gr.themes.Soft() # Gradio 6.0: theme 参数放在 launch() 中
685
  )
686