zhzhang

Flask框架py解决跨域问题示例:

# -*- coding: utf-8 -*-
# by zhenghai.zhang

from flask import Flask, render_template, jsonify, request
from flask_pymongo import PyMongo,DESCENDING
import datetime
import time


app = Flask(__name__)
app.config[\'MONGO_DBNAME\'] = \'service\'
app.config[\'MONGO_URI\'] = \'mongodb://xxx:27017/service\'
mongo = PyMongo(app)


def get_context():
    return {
        \'success\': True,
        \'message\': \'\',
        \'code\': 0,
        "data": [],
        "count": 0
    }


@app.route(\'/\', methods=["GET"])
def index():
    return render_template("op.html")


# /mongo?num=10&page=10&size=10
@app.route(\'/mongo\', methods=[\'GET\',\'OPTIONS\'])
def getmongodata():

    # num = request.args.get(\'num\', "30")
    page = request.args.get(\'page\', "1")
    size = request.args.get(\'size\', "30")
    rstart = request.args.get(\'startdate\', "0") # like 2017-08-27-00:00:00
    rend = request.args.get(\'enddate\', "0") # like 2017-08-29-00:00:00
    rdeviceid = request.args.get(\'deviceid\', "") # like xxxx
    ctx = get_context()

    if rstart =="0" and rend == "0":
        endtts = int(time.time()*1000000)
        today = datetime.datetime.now()
        delta = datetime.timedelta(days=7)
        start = today - delta
        dt = start.strftime("%Y-%m-%d-%H:%M:%S")
        timeArray = time.strptime(dt, "%Y-%m-%d-%H:%M:%S")
        startts = int(time.mktime(timeArray)) * 1000000
    else:
        try:
            startts = int(time.mktime(time.strptime(rstart, \'%Y-%m-%d-%H:%M:%S\'))*1000000)
            endtts = int(time.mktime(time.strptime(rend, \'%Y-%m-%d-%H:%M:%S\'))*1000000)
            # end1 = time.strptime(rend, \'%Y-%m-%d-%H:%M:%S\')
            # end2 = datetime.datetime(end1.tm_year, end1.tm_mon, end1.tm_mday)
            # delta1 = datetime.timedelta(days=1)
            # end3 = end2 + delta1
            # endtts = int(time.mktime(end3.timetuple())*1000000)

        except:
            print("parameter is wrong!!!")

    collection = mongo.db[\'trace_log\']
    print(endtts, startts, page, size )
    if rdeviceid == "":
        results = collection.find({\'sr\': {\'$gte\': startts, \'$lt\': endtts}})\
            .sort(\'sr\', DESCENDING)\
            .skip((int(page) - 1)*int(size))\
            .limit(int(size))
        ctx[\'count\'] = collection.find({\'sr\': {\'$gte\': startts, \'$lt\': endtts}}).count()

    else:
        results = collection.find({"$and":[{\'sr\': {\'$gte\': startts, \'$lt\': endtts}}, {"debug_log":{\'$elemMatch\':{"device_id": rdeviceid}}}]})\
            .sort(\'sr\', DESCENDING) \
            .skip((int(page) - 1) * int(size)) \
            .limit(int(size))
        ctx[\'count\'] = collection.find({"$and":[{\'sr\': {\'$gte\': startts, \'$lt\': endtts}}, {"debug_log":{\'$elemMatch\':{"device_id": rdeviceid}}}]}).count()

    for res in results:
        d = {}
        annotation = res.get("annotation")
        for anno in annotation:
            if anno.get("name") == "asr":
                debug_log = anno.get("debug_log")
                asr = debug_log[0].get("asr")
        debug_log = res.get("debug_log")
        debug_log0 = debug_log[0]
        session_id = debug_log0.get("session_id")
        codec = debug_log0.get("codec")
        if not session_id:
            session_id = ""     #超级无敌重要
        wavfile = session_id + ".wav"
        codecfile = session_id + "." + codec

        asrtimestr = session_id.split("-")[-1]
        st = time.localtime(float(asrtimestr))
        asrtime = time.strftime("%Y-%m-%d %H:%M:%S", st)
        asrthedate = time.strftime("%Y%m%d", st)
        asrdeviceid = debug_log0.get("device_id")
        asrdevicetype = debug_log0.get("device_type")
        asrdevicekey = debug_log0.get("device_key")

        # print(asrtime,asrdeviceid,asrdevicekey,asrdevicetype,asr,file)

        d[\'asrtime\'] = asrtime
        d[\'asrthedate\'] = asrthedate
        d[\'asrdeviceid\'] = asrdeviceid
        d[\'asrdevicekey\'] = asrdevicekey
        d[\'asrdevicetype\'] = asrdevicetype
        d[\'asr\'] = asr
        d[\'wavfile\'] = wavfile
        d[\'codecfile\'] = codecfile
        d[\'codec\'] = codec

        ctx[\'data\'].append(d)
    ctx[\'data\'] = sorted(ctx[\'data\'], key=lambda k: k[\'asrtime\'], reverse=True)

    resp = jsonify(ctx)
    resp.headers[\'Access-Control-Allow-Origin\'] = \'*\'
    resp.headers[\'Access-Control-Allow-Methods\'] = \'POST\'
    resp.headers[\'Access-Control-Allow-Headers\'] = \'x-requested-with,content-type\'
    return resp


if __name__ == \'__main__\':
    app.run("0.0.0.0",port=5000)

Django框架views.py解决跨域问题示例:

from django.http import JsonResponse
from django.db import connection
import datetime
import time
import json


def get_context():
    return {
        \'errcode\': 0,
        \'errmsg\': \'\',
        \'data\': []
    }


def ctxWraped(ctx):
    response = JsonResponse(ctx)
    response["Access-Control-Allow-Headers"] = "content-type"
    response["Access-Control-Allow-Origin"] = "*"
    response["Access-Control-Allow-Methods"] = "POST, GET, OPTIONS"
    response["Access-Control-Max-Age"] = "1000"
    return response


# 获取每天语音交互数
def speechtrend(request):

    startdate = request.GET.get("startdate", "0")
    enddate = request.GET.get("enddate", "0")

    if startdate == "0" or enddate == "0":
        today = datetime.datetime.now()
        delta = datetime.timedelta(days=30)
        start = today - delta
        startdate = start.strftime("%Y%m%d")
        enddate = today.strftime("%Y%m%d")



    cursor = connection.cursor()
    sql = "select thedate, sum(count) as count from dwb_speech_domain_d where thedate >= \'"+startdate+"\' and thedate < \'"+enddate+"\' group by thedate"
    cursor.execute(sql)

    result = cursor.fetchall()
    ctx = get_context()
    ctx["namelist"] = []
    ctx["namevalue"] = []
    for rec in result:
        record = {}
        record["name"] = rec[0]
        record["value"] = int(rec[1])
        ctx["namelist"].append(rec[0])
        ctx[\'data\'].append(record)
        ctx["namevalue"].append(int(rec[1]))
    connection.close()

    return ctxWraped(ctx)

 

网站端JavaScript代码

ajax代码:

      let url = \'http://localhost:8000/product/speechdistinctsn/\', self = this;
          $.ajax({
            type: \'GET\',
            async: true,
            url: url,
            dataType: \'json\',
            success: function (result) {
              self.speechdistinctsnname = result.namelist;
              self.speechdistinctsndata = result.namevalue;
              self.drawSpeechDistinctSn(\'speechdistinctsn\'); #echarts 渲染
            },
            error: function (errorMsg) {
              console.log(errorMsg)
            }
          })

fetch代码:

        let url = \'http://localhost:8000/product/speechdomain/\', self = this;
          fetch(url, {
              method: \'GET\',
              dataType: \'json\',
              headers: {
                \'Accept\': \'application/json\',
                \'Content-Type\': \'application/json\'
              }
          }).then(function(response) {
            response.json().then(function (result) {
              self.opinion = result.namelist;
              self.opinionData = result.data;
                self.drawGraph(\'main\')
            })
          })   

 

以上,网站+后端配合完美解决跨域问题。

 

参考文章

Django通过设置settings解决跨域问题:http://www.jianshu.com/p/1fd744512d83 PS:我自己试了N次发现不管用,不知道是姿势不对还是怎么着,

 

如有错误,还请各位大虾指教。

 

分类:

技术点:

相关文章: