django开发android_django android - CSDN
  • 直到回到最初的Django,之前很早使用过一点,还是觉得Django是真正的方便。完成android登录后台①创建项目以及app②基本设置,登录注册逻辑及反馈③开启服务进行测试①创建项目以及app②基本设置,登录注册逻辑及...

    序:以前一直想找到一个搭建app后台的框架,尝试过springboot,以及基于springboot的Guns(Guns官方的教程价格鄙视了我~)。直到回到最初的Django,之前很早使用过一点,还是觉得Django是真正的方便。


    完成android登录后台
    ①创建项目以及app
    ②基本设置,登录注册逻辑及反馈
    ③开启服务进行测试

    ①创建项目以及app




    ②基本设置,登录注册逻辑及反馈








     public void sendRequest() {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    HttpURLConnection connection = null;
                    BufferedReader reader = null;
                    try {
                        URL url = new URL(urlLoginOrSign);
                        connection = (HttpURLConnection) url.openConnection();
                        connection.setRequestMethod("POST");
                        connection.setConnectTimeout(8000);
                        connection.setReadTimeout(8000);
                        DataOutputStream out = new DataOutputStream(connection.getOutputStream());
                        String user_id = id.getText().toString();
                        String user_password = password.getText().toString();
                        out.writeBytes("username="+user_id+"&password="+user_password);
                        InputStream in = connection.getInputStream();
                        reader = new BufferedReader(new InputStreamReader(in));
                        StringBuilder response = new StringBuilder();
                        String line;
                        while ((line = reader.readLine()) != null) response.append(line);
                        Log.d(TAG, response.toString());
                        
                        //!!!这是一个极大的错误:在线程里处理不能更新UI,Toast也是不能的
                        //Toast.makeText(LoginActivity.this,response.toString(),Toast.LENGTH_SHORT).show();
    
                        //如果登录成功,并且已经点击了“记住密码”,则会保存该密码
                        SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();
                        if (response.toString().equals("登录成功") ){
                            //关闭等待登录窗口
                            progressDialog.dismiss();
                            Message msg = new Message();
                            msg.what = 0;
                            handle.sendMessage(msg);
                            if (rememberPass.isChecked())
                            {
                                String ac = id.getText().toString();
                                String pa = password.getText().toString();
                                editor.putBoolean("Remember_password", true);
                                editor.putString("Account", ac);
                                editor.putString("Password", pa);
                            }
                            else
                            {
                                editor.clear();
                            }
                            editor.apply();
                        }else if(response.toString().equals("登录失败") ){
                            //关闭等待登录窗口
                            progressDialog.dismiss();
                            Message msg = new Message();
                            msg.what = 1;
                            handle.sendMessage(msg);
                            if (rememberPass.isChecked())
                            {
                                String ac = id.getText().toString();
                                String pa = password.getText().toString();
                                editor.putBoolean("Remember_password", true);
                                editor.putString("Account", ac);
                                editor.putString("Password", pa);
                            }
                            else
                            {
                                editor.clear();
                            }
                            editor.apply();
                        }else if(response.toString().equals("用户不存在") ){
                            //关闭等待登录窗口
                            progressDialog.dismiss();
                            Message msg = new Message();
                            msg.what = 2;
                            handle.sendMessage(msg);
                            if (rememberPass.isChecked())
                            {
                                String ac = id.getText().toString();
                                String pa = password.getText().toString();
                                editor.putBoolean("Remember_password", true);
                                editor.putString("Account", ac);
                                editor.putString("Password", pa);
                            }
                            else
                            {
                                editor.clear();
                            }
                            editor.apply();
                        }
                    } catch (MalformedURLException e) {
                        Log.e(TAG, "url form wrong");
                    } catch (IOException e) {
                        Log.e(TAG, "IOException 1:" + e.getMessage());
                    } finally {
                        if (reader != null) {
                            try { reader.close(); }
                            catch (IOException e) { Log.e(TAG, "IOException 2:" +e.getMessage()); }
                        }
                        if (connection != null) {
                            connection.disconnect();
                        }
                    }
                }
            }).start();
        }
        private Handler handle = new Handler() {
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case 0:
                        Toast.makeText(LoginActivity.this,"登录成功!",Toast.LENGTH_SHORT).show();
                        LoginActivity.this.finish();
                        break;
                    case 1:
                       Toast.makeText(LoginActivity.this,"密码错误!",Toast.LENGTH_SHORT).show();
                       break;
                    case 2:
                        Toast.makeText(LoginActivity.this,"用户不存在!",Toast.LENGTH_SHORT).show();
                        break;
                }
            }
        };


    ③开启服务进行测试


    可以在浏览器上进行测试:




    展开全文
  • Django服务器与App(Android)客户端的简单实现Django后台搭建 作者是一个技术小白,这也是本人的第一篇文章,虽然网上关于DjangoAndroid结合搭建app的文章很多,但是还是想要根据自己在搭建过程中遇到的问题写一...

    Django服务器与App(Android)客户端的简单实现

    作者是一个技术小白,这也是本人的第一篇文章,虽然网上关于Django和Android结合搭建app的文章很多,但是还是想要根据自己在搭建过程中遇到的问题写一篇学习笔记,同时也供他人借鉴一下。
    说明:本示例app为本人实现 的一个很简单的记账软件,不喜勿喷。
    附github地址:https://github.com/Kingqibin/paykeep

    Django后台搭建

    环境要求:

    1. Ubuntu 16.04 LTS 桌面版/服务器版
    2. Python 3
    3. pip等

    代码实现

    1. 安装Django:
    pip install django
    
    1. 创建django项目:
    django-admin startproject paykeep # 创建项目
    django-admin startapp paykeep_service # 主要的服务内容
    

    startproject命令主要的作用是开启了一个项目的成熟框架,在之后的操作中只需要修改一下里面的参数。
    startapp命令主要的功能是创建实现功能的模板。
    以下在搭建时主要就是修改paykeep和paykeep_service文件夹下的主要内容。
    paykeep的目录文件
    paykeep_service下的文件目录结构

    1. 修改paykeep_service下的内容:

    (1)修改app.py的内容:

    class PaykeepServiceConfig(AppConfig):
        name = 'paykeep_service'   #修改name为你项目的名称
    

    (2)修改model.py的内容:

    from django.db import models
    # 以下定义自己的类模型,以及相对应的数据段
    class Pay(models.Model):
        id = models.IntegerField(null=False, primary_key=True)
        item_spend = models.CharField(null=False, max_length=50)
        money = models.FloatField(null=False)
        year = models.IntegerField(null=False)
        month = models.IntegerField(null=False)
        day = models.IntegerField(null=False)
        isPri = models.BooleanField(null=False)
        data_added = models.DateTimeField(auto_now_add=True)
    # 以下的函数的作用是在展示 调试时显示相应的数据内容,可以自行配置
        def __str__(self):
            temp = "id is : " + str(self.id) + "--item is : " + str(self.item_spend)
            return temp
    

    关于更多的类型数据定义可以自行google相关的django API。

    (3)修改最重要的view.py的内容:

    from django.shortcuts import render
    from .models import Pay #!!!
    from django.http import HttpResponse#!!!
    from django.core.exceptions import ObjectDoesNotExist
    
    
    def pay(request):
    # 解析请求方式:
        if request.method == 'POST':
            item_spend = request.POST.get('item_spend')
            id = request.POST.get('id')
            money = request.POST.get('money')
            year = request.POST.get('year')
            month = request.POST.get('month')
            day = request.POST.get('day')
            isPri = request.POST.get('isPri')
            fun = request.POST.get('fun')
            # 功能解析
            if fun == '1':
                Pay.objects.create(id=id, item_spend=item_spend, money=money, year=year, month=month, day=day, isPri=isPri)
                try:
                    t = Pay.objects.get(id=id)
                    return HttpResponse("add_ok")
                except ObjectDoesNotExist:
                    return HttpResponse("add_error")
            elif fun == '2':
                try:
                    temp = Pay.objects.get(id=id)
                    temp.delete()
                    return HttpResponse("delete_ok")
                except ObjectDoesNotExist:
                    return HttpResponse("not_found")
        else:#注意代码对齐
            return HttpResponse("error")
    

    以上为本程序实现所需要的核心代码部分,其中我在使用时的django请求方式好像只能用get和post(因为我在网络方面也是小白,具体的咱也不是太清楚,感兴趣的同学可以详细研究下,看其它地博主好像可以用)。因此使用了一个比较蠢的功能解析(即传fun字段来判断要执行哪一个功能)的方式来实现。
    另外在网络响应时使用的是HttpResponse具体的其它功能读者可以自行google API。

    1. 修改paykeep下的内容:

    (1)修改setting.py的内容:

    ···
    DEBUG = False
    ALLOWED_HOSTS = ['*'] # 可访问的ip
    ···
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'paykeep_service', # 项目名字
    ]
    
    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        'django.contrib.sessions.middleware.SessionMiddleware',
        'django.middleware.common.CommonMiddleware',
    #    'django.middleware.csrf.CsrfViewMiddleware', # 注释掉
        'django.contrib.auth.middleware.AuthenticationMiddleware',
        'django.contrib.messages.middleware.MessageMiddleware',
        'django.middleware.clickjacking.XFrameOptionsMiddleware',
    ]
    

    应该只需要做以上的修改就好,具体的可以参考github的源码。

    (2)修改重要的urls.py的内容:

    from django.contrib import admin
    from django.urls import path
    from paykeep_service.views import pay
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('add_pay/', pay),# !!!!!!!!!!!!!!!!
    ]
    

    这里的 add_pay/ 为请求方式,pay 为在view.py中定义的方式名,这里一定要对应。如果在view中写了更多的请求功能调用也可以在这里一一列明。

    1. 初始化一下数据库:
      使用manage.py文件
    python manage.py migrate
    
    1. 运行:
    python manage.py runserver 0.0.0.0:10000
    

    允许接入的ip地址(0.0.0.0)表示允许所有的ip接入,10000端口表示开放的端口。如果使用的是云服务器,一定要在安全组里面配置一下哟。


    目前为止,关于后台的搭建已经基本完成,因为我对于后台的了解也不是太多,所以讲的一些东西可能会不太准确,但是操作基本都是正确的。另外推荐大家在搭建好后台后使用postman进行一下响应的测试,看看传入响应的数据后是否会产生预期的效果,如果没用可能需要改一下代码了。防止在后面搭建完app后再反过头来修改后台,浪费时间。本人在写后台时也是经过了很长时间的调试才达到最后的效果,大家要保持耐心哟~提醒一下,如果模型更改了就要按照第5部重新部署一下数据库文件。


    APP的构建(Android)

    在这里假设大家对一些基础的android操作都已经很熟悉了,因此只是写一些与网络通信的介绍,其它的可以去github参照下源代码。按照国际惯例先贴代码:

    // 添加支出记录:
     private void addPay(final Pay pay,final int n){
     		//开启网络传输线程------这里可以使用rxjava等热门的框架代替,这里从简
            new Thread(new Runnable() {
                @Override
                public void run() {
                	//okhttp 客户端
                    OkHttpClient client = new OkHttpClient();
                    //请求体----添加你需要上传的字段
                    RequestBody requestBody = new FormBody.Builder()
                            .add("id",String.valueOf(pay.getId()))
                            .add("item_spend",pay.getName())
                            .add("money",String.valueOf(pay.getMoney()))
                            .add("year",String.valueOf(pay.getYear()))
                            .add("month",String.valueOf(pay.getMonth()))
                            .add("day",String.valueOf(pay.getDay()))
                            .add("isPri",pay.isPrivate()?"True":"False")
                            .add("fun",String.valueOf(1))
                            .build();
                    // 请求构建  添加你自己的ip地址   另外 请求方式 add_pay 要与urls.py中定义的相同
                    Request request = new Request.Builder()
                            .url("http://"+ip+"/add_pay/")
                            .post(requestBody)
                            .build();
                    try {
                        Response response = client.newCall(request).execute();
                        //请求处理
                        String rd = response.body().string();
                        Log.d(TAG, "get response : "+rd);
                        if (rd.isEmpty()){
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    if (n==1)
                                        Toast.makeText(MainActivity.this,"啊咧咧~下次再上传~",Toast.LENGTH_SHORT).show();
                                }
                            });
                        }else {
                            if (rd.equals("add_ok")){
                                runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        pay.setUploaded(true);
                                        pay.save();
                                        refreshSum();
                                        if (n==1)
                                            Toast.makeText(MainActivity.this,"添加成功",Toast.LENGTH_SHORT).show();
                                    }
                                });
                            }else {
                                runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        if(n==1)
                                            Toast.makeText(MainActivity.this,"添加失败",Toast.LENGTH_SHORT).show();
                                    }
                                });
                            }
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                if (n==1)
                                    Toast.makeText(MainActivity.this,"啊咧咧~下次再上传~",Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                }
            }).start();
        }
    	// 删除消费记录 几乎跟上面相同
        private void deletePay(final Pay pay,final int pos){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    OkHttpClient client = new OkHttpClient();
                    RequestBody requestBody = new FormBody.Builder()
                            .add("id",String.valueOf(pay.getId()))
                            .add("item_spend",pay.getName())
                            .add("money",String.valueOf(pay.getMoney()))
                            .add("year",String.valueOf(pay.getYear()))
                            .add("month",String.valueOf(pay.getMonth()))
                            .add("day",String.valueOf(pay.getDay()))
                            .add("isPri",pay.isPrivate()?"True":"False")
                            .add("fun",String.valueOf(2))
                            .build();
                    Request request = new Request.Builder()
                            .url("http://"+ip+"/add_pay/")
                            .post(requestBody)
                            .build();
                    try {
                        Response response = client.newCall(request).execute();
                        String rd = response.body().string();
                        Log.d(TAG, "get response : "+rd);
                        if (rd.isEmpty()){
                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(MainActivity.this,"啊咧咧~电波无法到达~",Toast.LENGTH_SHORT).show();
                                }
                            });
                        }else {
                            if (rd.equals("delete_ok")){
                                runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        pays.remove(pos);
                                        adapter.notifyItemRemoved(pos);
                                        recyclerView.scrollToPosition(pos);
                                        LitePal.delete(Pay.class,pay.getId());
                                        refreshSum();
                                        Toast.makeText(MainActivity.this,"消除成功",Toast.LENGTH_SHORT).show();
                                    }
                                });
                            }else {
                                runOnUiThread(new Runnable() {
                                    @Override
                                    public void run() {
                                        Toast.makeText(MainActivity.this,"消除失败",Toast.LENGTH_SHORT).show();
                                    }
                                });
                            }
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                Toast.makeText(MainActivity.this,"啊咧咧~电波无法到达~",Toast.LENGTH_SHORT).show();
                            }
                        });
                    }
                }
            }).start();
        }
    

    其它的一些安卓代码,大家有兴趣的话参见github,我在这里就只放核心了,如有问题可在评论区留言。


    目前为止项目基本就结束了!因为写文章时离项目完成有一段时间了,所以大家如果觉得我写的有问题,不清楚的地方都可以在评论区留言,我及时修改(只要我看地到-哈哈牛逼地叉会儿腰)

    转载请声明出处,谢谢

    展开全文
  • android上运行django

    2017-03-10 22:07:41
    这里是一个在android上运行django的例子,通常django是从命令行运行的,如果在android中运行,需要从java代码中加载python解释器,运行django脚本,需要修改一下django的启动参数。  该例子使用python2.7,首先...

        这里是一个在android上运行django的例子,通常django是从命令行运行的,如果在android中运行,需要从java代码中加载python解释器,运行django脚本,需要修改一下django的启动参数。

        该例子使用python2.7,首先需要提取django,在windows中安装diango,安装完成之后,打包目录“\Lib\site-ackages\Django-1.10.5-py2.7.egg\django”为一个zip,放到android工程的assets目录下面;创建mysite站点,将站点打包成为mysite.zip,放到android工程的assets目录下面。

    1. 创建工程

       该例子代码使用eclipse开发,可以直接导入到android studio中。

       libs目录下添加共享库文件:

       

        assets目录下添加python扩展库,django.zipmysite.zip

       

    2. 修改django

    Django加载需要一定时间,加载完成之后通知界面,需要设置共享变量MainActivity,该变量提供函数OnDJangoInitFinish,函数由java编写,可以由python调用。创建一个空的python module文件” starglobal.py”管理python变量

       

    public void OnDJangoInitFinish()
    {
        Message message = handler.obtainMessage();
        message.what = 0;
        message.obj = null;
        handler.sendMessage(message);
    }
    
        修改runserver.py, django\ core\management\commands目录下
    def inner_run(self, *args, **options):
    ….
    try:
        import starglobal
        starglobal.MainActivity.OnDJangoInitFinish()  # notify host
        handler = self.get_handler(*args, **options)
        run(self.addr, int(self.port), handler,
            ipv6=self.use_ipv6, threading=threading)
    

        修改站点的manage.pydjango加载之后会进入循环,因此为了避免阻止界面线程,在python中创建一个线程运行。在manage.py运行最后,进入cle的消息循环,界面创建一个线程初始化并加载django

    #!/usr/bin/env python
    import os
    import sys
    import traceback 
    import thread
    import time
    
    def doit(val):
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
        try:
            from django.core.management import execute_from_command_line
        except ImportError:
            # The above import may fail for some other reason. Ensure that the
            # issue is really that Django is missing to avoid masking other
            # exceptions on Python 2.
            try:
                import django
            except ImportError:
                traceback.print_exc()
                raise ImportError(
                    "Couldn't import Django. Are you sure it's installed and "
                    "available on your PYTHONPATH environment variable? Did you "
                    "forget to activate a virtual environment?"
                )
            raise
        execute_from_command_line(['manage.py', 'runserver','--noreload'])
            
    if __name__ == "__main__":
        try:
            import starglobal
            starglobal.MainActivity = MainActivity
            thread.start_new_thread(doit,(0,))
            while True :
                while libstarpy._SRPDispatch(False) == True :
                    pass
                libstarpy._SRPUnLock()
                time.sleep(0.01) 
                libstarpy._SRPLock()        
            
        except Exception :
            traceback.print_exc()
    

    3. 初始化python解释器,加载Django

    a.python2.7.zip拷贝到"/data/data/"+getPackageName()+"/files"目录下

            File destDir = new File("/data/data/"+getPackageName()+"/files");
            if(!destDir.exists())
            	destDir.mkdirs();        
            java.io.File python2_7_libFile = new java.io.File("/data/data/"+getPackageName()+"/files/python2.7.zip");
            if( !python2_7_libFile.exists() ){    
    	        try{
    	        	copyFile(this,"python2.7.zip",null);
    	        }
        	    catch(Exception e){
            	}
            }  
    

    b. django.zipmysite.zip解压到"/data/data/"+getPackageName()+"/files"目录下

            try{
            	AssetManager assetManager = getAssets();
            	InputStream dataSource = assetManager.open("django.zip");
            	unzip(dataSource, "/data/data/"+getPackageName()+"/files",false );
            	dataSource.close();
            	dataSource = assetManager.open("mysite.zip");
            	unzip(dataSource, "/data/data/"+getPackageName()+"/files",false );
            }
            catch(Exception e)
            {
            	
            }
    

    c. django运行需要加载的python扩展库拷贝到"/data/data/"+getPackageName()+"/files"目录下

    try{    	
            	copyFile(this,"zlib.so",null);
            	copyFile(this,"_json.so",null);
            	copyFile(this,"_random.so",null);
            	copyFile(this,"_socket.so",null);
            	copyFile(this,"_sqlite3.so",null);
            	copyFile(this,"select.so",null);
            	copyFile(this,"time.so",null);
            	copyFile(this,"unicodedata.so",null);
            	copyFile(this,"datetime.so",null);
            	copyFile(this,"fcntl.so",null);
            	copyFile(this,"_struct.so",null);
            	copyFile(this,"binascii.so",null);
            	copyFile(this,"_collections.so",null);
            	copyFile(this,"operator.so",null);
            	copyFile(this,"itertools.so",null);
            	copyFile(this,"_functools.so",null);
            	copyFile(this,"math.so",null);
            	copyFile(this,"_io.so",null);
            	copyFile(this,"cStringIO.so",null);
            	copyFile(this,"_hashlib.so",null);
            	copyFile(this,"array.so",null);
            	copyFile(this,"cPickle.so",null);
            }
            catch(Exception e){
            	System.out.println(e);        	
            }
    

    d.初始化clepython解释器,设置模块搜索路径,加载manage.py
            /*----init starcore----*/
            StarCoreFactoryPath.StarCoreCoreLibraryPath = this.getApplicationInfo().nativeLibraryDir;
            StarCoreFactoryPath.StarCoreShareLibraryPath = this.getApplicationInfo().nativeLibraryDir;
            StarCoreFactoryPath.StarCoreOperationPath = "/data/data/"+getPackageName()+"/files";
            
            final String LibPath = this.getApplicationInfo().nativeLibraryDir;
            final Activity GActivity = this;
            new Thread(new Runnable(){
                @Override
                public void run() {
    		        StarCoreFactory starcore= StarCoreFactory.GetFactory();
    		        StarServiceClass Service=starcore._InitSimple("test","123",0,0);
    		        StarSrvGroupClass SrvGroup = (StarSrvGroupClass)Service._Get("_ServiceGroup");
    		        Service._CheckPassword(false);
    		        
    		        /*----run python code----*/		
    		        SrvGroup._InitRaw("python",Service);
    		        StarObjectClass python = Service._ImportRawContext("python","",false,"");
    		        python._Call("import", "sys");
    	
    		        StarObjectClass pythonSys = python._GetObject("sys");
    		        StarObjectClass pythonPath = (StarObjectClass)pythonSys._Get("path");
    		        pythonPath._Call("insert",0,"/data/data/"+getPackageName()+"/files/python2.7.zip");
    		        pythonPath._Call("insert",0,LibPath);
    		        pythonPath._Call("insert",0,"/data/data/"+getPackageName()+"/files");
    		        pythonPath._Call("insert",0,"/data/data/"+getPackageName()+"/files/django");		
    		        pythonPath._Call("insert",0,"/data/data/"+getPackageName()+"/files/mysite");
    		
    		        python._Set("MainActivity", GActivity);
    		 	
    		        Service._DoFile("python", "/data/data/"+getPackageName()+"/files/mysite/manage.py", ""); 
                }
            }).start();
    

    4.运行结果和实例下载

       

       也可以将djangomysite放在sd卡上,此时模块的搜索路径需要相应修改





    展开全文
  • 最近在学习django,就想着自己搭建一个django的服务器,自己写app的客户端,...djangoandroid项目的搭建略过服务端django的项目配置1,首先将我们创建的app模块配置在setting这里,本例获取验证码用的是logreg模块

    最近在学习django,就想着自己搭建一个django的服务器,自己写app的客户端,因为django是初学所以还是遇到了几个坑的废话不多先贴出项目地址:https://github.com/ymeddmn/PythonWebDemo

    python群号码:387214990

    django和android项目的搭建略过

    服务端django的项目配置

    1,首先将我们创建的app模块配置在setting这里,本例获取验证码用的是logreg模块
    首先将我们创建的app模块配置在setting这里,本例获取验证码用的是logreg模块

    2,host的配置如下图,此ip为本机ip地址,DEBUG=True
    host的配置如下图,此ip为本机ip地址,DEBUG=True

    3,将此处的依赖注释,具体原因我暂时也没有搞明白
    将此处的依赖注释,具体原因我暂时也没有搞明白

    4,下面看一下实现请求的代码

    这里用post方法获取到请求的参数:手机号,截取前四位返回为客户端
    如果请求方法错误会返回给客户端错误信息,转json的操作请看demo

    from django.shortcuts import render
    from django.http import HttpResponse
    from app import utils, JsonUtil
    
    
    def getCode(request):
        code = 200
        des = ''
        success = True;
        item = {}
        body = []
        if utils.checkRequestMethon(request, 'POST'):
            phone = request.POST.get('phone')
            resCode = phone[0:4]
            print(resCode)
            item.setdefault('checkCode', resCode)
            body.append(item)
            print(body)
        else:
            success = False
            code = 0
            des = '请求方法错误'
        if success:
            return HttpResponse(JsonUtil.toResultJson(code, body, '成功').encode('utf-8'))
        else:
            return HttpResponse(JsonUtil.toResultJson(code, body, des).encode('utf-8'))
    

    5,Url的配置如下
    Url的配置如下

    note:注意转json串的时候这里记得加上ensure_ascii=False,否则客户端中文会无法显示
    这里写图片描述

    其他代码请看项目中的 djangoproject

    客户端实现Android代码实现

    客户端会在在按钮点击的时候用okhttp请求服务器获取验证码,将请求下来的结果显示到按钮上

    package demo.horse.com.djangoprojectclient.logreg;
    
    import android.Manifest;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.support.v4.app.ActivityCompat;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.Button;
    
    import com.squareup.okhttp.Call;
    import com.squareup.okhttp.Callback;
    import com.squareup.okhttp.FormEncodingBuilder;
    import com.squareup.okhttp.OkHttpClient;
    import com.squareup.okhttp.Request;
    import com.squareup.okhttp.Response;
    
    import java.io.IOException;
    import java.net.URLDecoder;
    import java.nio.charset.Charset;
    
    import demo.horse.com.djangoprojectclient.R;
    
    
    public class RegesterActivity extends AppCompatActivity implements View.OnClickListener {
        private Button btnCode;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_regester);
            initView();
    
        }
    
        private void initView() {
            btnCode = (Button) findViewById(R.id.btn_getcode);
            btnCode.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    OkHttpClient client = new OkHttpClient();
                    FormEncodingBuilder builder = new FormEncodingBuilder();
                    builder.add("phone", "13691599815");
    
                    Request request = new Request.Builder()
                            .url("http://192.168.1.100:8000/getCode/")
                            .post(builder.build())
                            .build();
                    Call call = client.newCall(request);
                    call.enqueue(new Callback() {
                        @Override
                        public void onFailure(Request request, IOException e) {
                            e.printStackTrace();
                        }
    
                        @Override
                        public void onResponse(Response response) throws IOException {
    
                            Message msg = handler.obtainMessage();
                            msg.obj = response.body().string();
                            handler.sendMessage(msg);
                        }
                    });
                }
            }).start();
    
        }
    
        Handler handler = new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                String m = (String) msg.obj;
                try 
                    m = URLDecoder.decode(m, "utf-8");
                    btnCode.setText(m);
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
                return false;
            }
        });
    }
    

    上面唯一需要注意的是 m = URLDecoder.decode(m, “utf-8”);
    必须对请求下来的数据进行解码
    对了,还要记得加上请求网络权限

    下面看一下实现的效果图

    请求前,button显示获取验证码
    这里写图片描述

    点击请求成功显示请求下来的json串
    这里写图片描述

    项目地址https://github.com/ymeddmn/PythonWebDemo
    python群号码:387214990

    展开全文
  • 上一篇讲了一下python 中Django 框架模块的一些基本概念,比如安装Django 模块,以及url的一些映射规则,以及Django 的模板语法! 这一篇就主要讲解Django 与后台数据库的一些联系。 首先新建好一个项目app中,若还不...
  • 遇到了一个问题,通过java发送post请求到django后台,但是djangorequest.POST.get('email')获得结果为none之后了解到java发送到django后台的数据为字节流,尝试用print(request.body)输出的结果为字节流解决方法将...
  • 工具及版本: ... 本例完成django静态开发,将用户信息存至mysql数据库,并可展示出来所有用户数据。主要包括以下四部分:1. 新建项目a) 在pycharm内新建django项目userproject: b)运行开发服务器测试项目
  • 1 新建django项目(2.02)django-admin startproject apiTest2 新建app在项目目录下G:\apiTest>python manage.py startapp runcase3 打开apiTest\apiTest\settings.py 将新建app添加到配置文件INSTALLED_APPS...
  • 一,android机子连接django测试服务器方法 二,mac下停止django监听端口命令 一, 自己在随便写写一个小项目,服务器用django搭建,今天在测试Android连接django服务器。看文档是说让别人连接到服务器是通过...
  • 概述最近在做一个Android App,需要从一个Django部署的服务器上读取用户的个人信息。拟使用OAuth2作为授权的方案,简单搜索之后发现Django有一个oauth toolkit的项目,于是就使用了oauth toolkit。在Android系统上,...
  • Django开发之html交互

    2019-08-08 08:11:14
    html中用户输入信息,由Django的view.py处理,大致用到了以下几类格式: 1. 文本框 <input type="text" name="vid" size="10" height="20"> 或由bootcss修饰的 <div class="col-sm-2" > <...
  • 用过django的都会发现用django开发的网站统一局域网内的其他用户无法访问这是因为我们需要在settings.py内设定才可以。 首先我们需要知道自己局域网内的ip地址 window用户在cmd中输入**ipconfig** ipv4 address...
  • 参加一个比赛,指定用虹软的人脸识别功能,奈何虹软人脸识别要自己建人脸库,不然就只能离线用,总不能装个样子,简单看了下虹软Demo,下面决定用这种简单方法实现在线人脸识别: Android端(虹软Demo)取出人脸信息...
  • 前面的文章中我已经搭建好了基于eclipse的java
  • Django教程,从零开始,到最后成功部署上线的项目。这一节,我们将开发友链,并且是全套流程哦,全套! Peekpa.com的官方地址:http://peekpa.com 经过之前几节的文章开发,我们其实已经很完善的开发了一套从后台...
  • 刚接触这些,菜鸡一个,有...一、Django 教程 1、虚拟环境创建工程 注意venv这个虚拟环境目录,以及我们额外创建的templats目录 2、创建APP 检查环境: pycharm下方terminal 输入:where python 和 python -V...
  • 好久没有更技术文了,再不写怕是博客要废掉了,今天更一篇关于搭建服务端并与Android端通信的文章,为了节省代码量,服务端使用Python Flask,Android端使用Okhttp,还是老样子,文章不讲原理只给具体实现,想要了解...
  • 最近接到一个需求,要做一个安卓app,这个app就一个功能,查看说说 ... 理了下需求: ...看了下需求后,发现使用django来做网站后台非常方便快速,还提供了账号权限系统,另外安卓app开发并非我本行...
  • Django - 创建工程 和 APP 与 开发工具这里在testapp下进行开发一个模块,演示一个例子。2. 栗子(1)实现view testapp/view.py 显示界面内容为”TestApp Index“ 代码如下:from django.http import HttpResponse ...
1 2 3 4 5 ... 20
收藏数 4,175
精华内容 1,670
关键字:

django开发android