基于Django+ajax实现的仿fir应用分发平台
自己也是第一次做,过程中难免会有很多错误,还请大家指正,谢谢!!
前言
上个月突然有个需要,让我来做一个分发平台的后台,我当时也是一脸懵逼,自己本来是做安卓的,基本上没接触过后台,但既然任务来了,那就着手去做了。我选择的就是django+ajax的方式来实现的
提示:以下是本篇文章正文内容,下面案例可供参考
一、后台部分
我使用的是python3.7,创建django项目,这里可以参考使用python框架Django搭建web应用
创建django项目后,首先添加一个数据库,修改models.py文件
from django.db import models
# Create your models here.
class ModelFileField(models.Model):
describe = models.CharField(max_length=200, verbose_name="版本描述")
# 限制上传包为apk 或 ipa
file = models.FileField(upload_to='package/',
validators=[validators.FileExtensionValidator(['apk', 'ipa'], message='123')]) # 将格式化为时间目录
ios_or_android = models.IntegerField(null=True)
appname = models.CharField(max_length=64)
appsize = models.CharField(max_length=64)
appversion = models.CharField(max_length=64)
currenttime = models.TextField(max_length=100)
packagename = models.CharField(max_length=64)
button = models.IntegerField(null=True)
再在view.py中添加上传安装包的方法
在这里需要注意的事,ipa包获取APP的各类信息是通过解压ipa后读取其中的info.plist文件实现的,apk包则是利用aapt解析实现的,可以参考一下别的地方的获取apk信息的方法。
def upload_file(request):
if request.method == 'POST':
forms = ModelFormFile(request.POST, request.FILES)
if forms.is_valid():
current_time = int(time.time())
instance = ModelFileField(file=request.FILES['file'], describe=request.POST.get('describe'),
currenttime=current_time)
instance.save()
now_time = datetime.datetime.fromtimestamp(int(time.time()), pytz.timezone('Asia/Shanghai')).strftime(
'%m-%d_%H-%M-%S')
apk_dir = instance.file.path
global dir_name
dir_name = os.path.dirname(apk_dir)
timestamp_filename = now_time
# 获取文件扩展名
ext_name = os.path.splitext(apk_dir)[1]
# 初始化并赋值必要参数
appname = ''
app_version = ''
package_name = ''
filename_with_ext = ''
# 获取安装包大小
size = floor(os.path.getsize(apk_dir) / (1024 * 1000))
app_size = str(size) + "M"
if ext_name == '.apk':
apkInfo = app_info.ApkInfo(apk_dir)
appname = apkInfo.get_apk_name()
app_size = apkInfo.get_apk_size()
app_version = apkInfo.get_apk_version()
package_name = apkInfo.get_apk_package()
instance.appname = appname
instance.appsize = app_size
instance.appversion = app_version
instance.packagename = package_name
instance.ios_or_android = 2
instance.file = timestamp_filename + '.apk'
instance.packagename = apk_dir
instance.save()
os.rename(apk_dir, dir_name + '/android/' + timestamp_filename + '.apk')
elif ext_name == '.ipa':
# 先准备压缩包的绝对路径
zip_dir = dir_name + timestamp_filename + '.zip'
# 准备一个压缩完毕的文件夹绝对路径
decompress_folder_dir = dir_name + '/' + timestamp_filename + '/'
# 修改安装包后缀名为zip 同时将安装包名称修改为 时间戳名称
os.rename(apk_dir, zip_dir)
# 获取压缩文件的对象
zip_file = zipfile.ZipFile(zip_dir)
# 得到压缩包里的文件目录
zip_list = zip_file.namelist()
# 循环解压文件到指定目录
for filename in zip_list:
zip_file.extract(filename, decompress_folder_dir)
# 解压完毕,关闭文件,释放内存
zip_file.close()
# 修改数据库中标识
ios_or_android = 1
# ios文件夹绝对路径
ios_folder_dir = dir_name + '/ios/'
# 准备一个相对路径用于存储ipa
ipa_dir = ios_folder_dir + timestamp_filename + '.ipa'
filename_with_ext = os.path.basename(ipa_dir)
shutil.move(zip_dir, ipa_dir)
info_plist_dir = dir_name + '/' + timestamp_filename + '/Payload/MainActivity.app/Info.plist'
# -------------读取info.plist的内容-------------------
try:
plist = readPlist(info_plist_dir)
# 获取App名称
appname = plist['CFBundleDisplayName']
# 获取包名
package_name = plist['CFBundleIdentifier']
# 获取app版本号
app_version = plist['CFBundleShortVersionString']
# shutil.copyfile(dir_name + '/manifest.plist', dir_name + '\\plist/manifest.plist')
plist = readPlist(dir_name + '/manifest.plist')
plist_items = plist['items'][0]
plist_items['metadata']['title'] = appname
plist_items['assets'][0][
'url'] = 'https://ecssmobiletest.e-chinalife.com:8085/dist_plat/static/package/ios/' + filename_with_ext
plist_items['metadata']['bundle-identifier'] = package_name
plist_items['metadata']['bundle-version'] = app_version
writePlist(plist, dir_name + '/plist/' + timestamp_filename + '.plist')
except InvalidPlistException as e:
print("Not a Plist or Plist Invalid:", e)
# 删除文件夹
shutil.rmtree(dir_name + '/' + timestamp_filename + '/')
instance.file = timestamp_filename + '.ipa'
instance.appname = appname
instance.appsize = app_size
instance.appversion = app_version
instance.ios_or_android = ios_or_android
instance.packagename = package_name
instance.save()
print('id=' + str(instance.id))
forms = ModelFormFile()
app_list = ModelFileField.objects.all()
print(request.user)
return render(request, 'new.html', {'forms': forms, 'data': app_list})
二、前端交互
1.引入库
代码如下(示例):
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
2.读入数据
代码如下(示例):
data = pd.read_csv(
'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())
该处使用的url网络请求的数据。
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。