基于Django+ajax实现的仿fir应用分发平台

基于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提供了大量能使我们快速便捷地处理数据的函数和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值