普段ajaxするときはlocalhost/hoge/index.pyなどのURLでアクセスして、ajax(jquery)のURL指定は、

$.ajax({
  url : 'index.py' 
})

のように、サーバのルート以下にあるhtml起点でやりますが、
chrome拡張のpopupからajaxリクエストを投げる場合、popup.js内では以下でいいんでしょうか?

$.ajax({
  url : 'http://localhost/hoge/index.py'
})

200が返ってるので成功はしていますが、これだとサーバ側のコードがそのまま返ってきてしまいます。サーバ側のContent-typeをtext/htmlやapplication/jsonにしてみましたが、変わらず見当がつきません。

また、サーバーはpython -m http.server --cgiで起動したPythonの開発サーバーを使っています。

初歩的で恐縮ですがよろしくお願いします。

追記:popup側コード

$('#button').click(function(){
    chrome.windows.create({url : chrome.runtime.getURL("select_list/index.html")}, function(wins){
        $.ajax({
            url : 'http://localhost:8000/chrome-ex-template-master/src/cgi-bin/index.py',
            cache : false
        }).done(function(data){
            console.log(data)
            chrome.tabs.query({active : true, currentWindow : true}, function(tabs){
                chrome.tabs.sendMessage(wins.tabs[0].id, {"rows" : data})
            })
        }).fail(function(jqXHR, textStatus, errorThrown){
            console.log(jqXHR, textStatus, errorThrown)
        })
    })

})

python側のコードは以下です。

#!C:\Users\bafcom\venv\Scripts\python
from __future__ import print_function
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
import json


print('Content-type: application/json')
print('Access-Control-Allow-Origin : "*"\n\n')
cgitb.enable()
# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly']

# The ID and range of a sample spreadsheet.
SAMPLE_SPREADSHEET_ID = 'id...'
SAMPLE_RANGE_NAME = 'リスト!A1500:M'

def main():
    """Shows basic usage of the Sheets API.
    Prints values from a sample spreadsheet.
    """
    creds = None
    # The file token.pickle stores the user's access and refresh tokens, and is
    # created automatically when the authorization flow completes for the first
    # time.
    if os.path.exists('token.pickle'):
        with open('token.pickle', 'rb') as token:
            creds = pickle.load(token)
    # If there are no (valid) credentials available, let the user log in.
    if not creds or not creds.valid:
        if creds and creds.expired and creds.refresh_token:
            creds.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file(
                'credentials.json', SCOPES)
            creds = flow.run_local_server()
        # Save the credentials for the next run
        with open('token.pickle', 'wb') as token:
            pickle.dump(creds, token)

    service = build('sheets', 'v4', credentials=creds)

    # Call the Sheets API
    sheet = service.spreadsheets()
    result = sheet.values().get(spreadsheetId=SAMPLE_SPREADSHEET_ID,
                                range=SAMPLE_RANGE_NAME).execute()
    values = result.get('values', [])

    if not values:
        print('No data found.')
    else:
        arr = []
        for row in values:
          try:
            if row[11] and row[12]:
              pass
          except:
            arr.append(row)
    print(json.dumps(arr))
if __name__ == '__main__':
    main()