You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
q-a_platform/flasky.py

122 lines
4.9 KiB
Python

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import json
import os
import threading
import time
import requests
from flask import Response
from flask_admin.contrib.fileadmin import FileAdmin
from flask_admin.contrib.sqla import ModelView
from flask_docs import ApiDoc
from flask_migrate import Migrate
from app import create_app, db, admin
from app.models import User, Role, Students, Permission, Post, Comment, Like, Notification, Transaction, Activity
# if you want to execute the program
# please run this file
from config import config
config_name = os.getenv('FLASK_CONFIG') or 'default'
app = create_app(config_name)
migrate = Migrate(app, db, render_as_batch=True)
from geetest_config import GEETEST_ID, GEETEST_KEY, REDIS_HOST, REDIS_PORT, CYCLE_TIME, BYPASS_URL, \
GEETEST_BYPASS_STATUS_KEY
from sdk.geetest_lib import GeetestLib
geetest_dict = {}
# 发送bypass请求获取bypass状态并进行缓存
def check_bypass_status():
response = ""
params = {"gt": GEETEST_ID}
try:
response = requests.get(url=BYPASS_URL, params=params)
except Exception as e:
print(e)
if response and response.status_code == 200:
print(response.content)
bypass_status_str = response.content.decode("utf-8")
bypass_status = json.loads(bypass_status_str).get("status")
geetest_dict[GEETEST_BYPASS_STATUS_KEY] = bypass_status
else:
bypass_status = "fail"
geetest_dict[GEETEST_BYPASS_STATUS_KEY] = bypass_status
print("bypass状态已经获取并存入redis当前状态为-{}".format(bypass_status))
check_bypass_status()
@app.shell_context_processor
def make_shell_context():
return dict(db=db, User=User, Role=Role, Students=Students, Permission=Permission, Post=Post,
Comment=Comment, Like=Like, Notification=Notification, Transaction=Transaction, Activity=Activity)
# 从缓存中取出当前缓存的bypass状态(success/fail)
def get_bypass_cache():
bypass_status_cache = geetest_dict[GEETEST_BYPASS_STATUS_KEY]
bypass_status = bypass_status_cache
return bypass_status
# 验证初始化接口GET请求
@app.route("/auth/register_check", methods=["GET"])
def first_register():
# 必传参数
# digestmod 此版本sdk可支持md5、sha256、hmac-sha256md5之外的算法需特殊配置的账号联系极验客服
# 自定义参数,可选择添加
# user_id 客户端用户的唯一标识确定用户的唯一性作用于提供进阶数据分析服务可在register和validate接口传入不传入也不影响验证服务的使用若担心用户信息风险可作预处理(如哈希处理)再提供到极验
# client_type 客户端类型web电脑上的浏览器h5手机上的浏览器包括移动应用内完全内置的web_viewnative通过原生sdk植入app应用的方式unknown未知
# ip_address 客户端请求sdk服务器的ip地址
bypass_status = get_bypass_cache()
gt_lib = GeetestLib(GEETEST_ID, GEETEST_KEY)
digestmod = "md5"
user_id = "test"
param_dict = {"digestmod": digestmod, "user_id": user_id, "client_type": "web", "ip_address": "127.0.0.1"}
if bypass_status == "success":
result = gt_lib.register(digestmod, param_dict)
else:
result = gt_lib.local_init()
# 注意,不要更改返回的结构和值类型
return Response(result.data, content_type='application/json;charset=UTF-8')
@app.route("/favicon.ico")
def favicon():
return app.send_static_file('favicon.ico')
# thread = threading.Thread(target=check_bypass_status)
# thread.start()
# app.secret_key = GeetestLib.VERSION
# User, Role, Students, Permission, Post, Comment, Like, Notification, Transaction, Activity
if config[config_name].DEBUG:
admin.add_view(ModelView(User, db.session, name="Users", endpoint="users"))
admin.add_view(ModelView(Role, db.session, name="roles", endpoint="roles"))
admin.add_view(ModelView(Students, db.session, name="Studentss", endpoint="Studentss"))
# admin.add_view(ModelView(Permission, db.session, name="Permissions", endpoint="Permissions"))
admin.add_view(ModelView(Post, db.session, name="Posts", endpoint="Posts"))
admin.add_view(ModelView(Comment, db.session, name="Comments", endpoint="Comments"))
admin.add_view(ModelView(Like, db.session, name="Likes", endpoint="Likes"))
admin.add_view(ModelView(Notification, db.session, name="Notifications", endpoint="Notifications"))
admin.add_view(ModelView(Transaction, db.session, name="Transactions", endpoint="Transactions"))
admin.add_view(ModelView(Activity, db.session, name="Activities", endpoint="Activities"))
admin.add_view(FileAdmin("."))
ApiDoc(
app,
title="Sample App",
version="1.0.0",
description="A simple app API",
)
app.config["API_DOC_MEMBER"] = ["app", "main"]
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=os.environ.get("PORT", 5000))