如何使用Django(python)實(shí)現(xiàn)android的服務(wù)器端
Django(python)簡(jiǎn)單實(shí)現(xiàn)android的服務(wù)器端
1. 所需工具
PyCharm--python編輯工具,這里要寫Django,因此必須是專業(yè)版,社區(qū)版沒有此功能。
MySql--登錄信息需要存儲(chǔ)到數(shù)據(jù)庫里面。
Android Studio--用于手機(jī)端代碼的編寫。
2. 服務(wù)器端的實(shí)現(xiàn)
2.1. 新建一個(gè)Django項(xiàng)目,命名為:androidSevers
2.2. 為androidSevers添加一個(gè)APP模塊:Login_sever
python manage.py startapp Login_sever
完成后效果如圖所示
2.3. 數(shù)據(jù)庫連接及其setting.py配置
添加APP
連接MySQL(大小寫嚴(yán)格區(qū)分)
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'androidsevers', 'USER': 'root', 'PASSWORD': '123456', 'PORT': 3306, 'HOST': '', } }
2.4. 通過設(shè)計(jì)model.py,映射到數(shù)據(jù)庫。
from django.db import models # Create your models here. class Login(models.Model): ID=models.AutoField(primary_key=True) username=models.CharField(max_length=25,verbose_name='用戶名') password=models.CharField(max_length=25,verbose_name='密碼') adminname=models.CharField(max_length=25,verbose_name='用戶姓名')
2.5. 將model.py映射到數(shù)據(jù)庫
在pycharm下面的終端下執(zhí)行
創(chuàng)建遷移文件
python manage.py makemigrations
將遷移文件寫入數(shù)據(jù)庫
python manage.py migrate
執(zhí)行完成后,在數(shù)據(jù)庫里顯示,如圖所示。
在數(shù)據(jù)庫里寫入一條記錄,用于測(cè)試。如
2.5. 配置路由信息,urls.py
from django.contrib import admin from django.urls import path from Login_sever import views urlpatterns = [ path('admin/', admin.site.urls), path('login/',views.login_view) ]
2.6. 對(duì)數(shù)據(jù)的操作views.py
from django.core.exceptions import ObjectDoesNotExist from django.http import HttpResponse from django.shortcuts import render from Login_sever.models import Login import json def login_view(request): if request.method=='POST': username=request.POST.get('username') password=request.POST.get('password') date_error={ 'username': username, 'adminname': '', 'code':'錯(cuò)誤,用戶不存在', 'Status Code': 404 } try: user=Login.objects.get(username=username) if user.password==password: data={ 'username':user.username, 'adminname':user.adminname, 'code': '成功', 'Status Code': 200 } return HttpResponse(json.dumps(data), content_type='application/json') else: date_error = { 'username': username, 'adminname': '', 'code': '密碼錯(cuò)誤', 'Status Code': 404 } return HttpResponse(json.dumps(date_error), content_type='application/json') except ObjectDoesNotExist: return HttpResponse(json.dumps(date_error),content_type='application/json') else: return HttpResponse('GET請(qǐng)求無效')
2.7. 啟動(dòng)服務(wù)器
2.7.1. 查詢服務(wù)器的IP地址
ipconfig
2.7.2. 在setting里面配置IP地址
將這里修改為你的IP地址
2.7.3. 啟動(dòng)服務(wù)器
在pycharm的終端中輸入
python manage.py runserver 192.168.0.104:8000
服務(wù)器端完成
3. 客戶端的實(shí)現(xiàn)
3.1. 用android創(chuàng)建一個(gè)工程:androidclient
3.2. 新建一個(gè)LoginActivity
3.3. 新建一個(gè)類Login_cs
完成后如圖所示
3.4. 在Login_cs里面寫入
public class Login_cs { /** * username : admin * adminname : 李東陽 * code : 成功 * Status Code : 200 */ private String username; private String adminname; private String code; @SerializedName("Status Code") private int _$StatusCode185; // FIXME check this code public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getAdminname() { return adminname; } public void setAdminname(String adminname) { this.adminname = adminname; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public int get_$StatusCode185() { return _$StatusCode185; } public void set_$StatusCode185(int _$StatusCode185) { this._$StatusCode185 = _$StatusCode185; } }
3.5. 修改配置文件AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.androidclient"> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".LoginActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".MainActivity"></activity> </application> </manifest>
3.6. 添加依賴
implementation 'com.squareup.okhttp3:okhttp:3.10.0' implementation 'com.google.code.gson:gson:2.6.2'
3.7. 設(shè)置activity_login.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".LoginActivity"> <EditText android:layout_marginTop="35dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="請(qǐng)輸入用戶名" android:gravity="center" android:textSize="25dp" android:id="@+id/tvUserName"/> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="請(qǐng)輸入密碼" android:textSize="25dp" android:gravity="center" android:inputType="textPassword" android:id="@+id/tvPassword"/> <Button android:id="@+id/btnLogin" android:layout_marginTop="25dp" android:layout_width="wrap_content" android:layout_gravity="center" android:background="#03A9F4" android:text="登錄" android:textColor="#fff" android:textSize="25dp" android:paddingLeft="35dp" android:paddingRight="35dp" android:layout_height="wrap_content"/> </LinearLayout>
3.8. 設(shè)置LoginActivity.java
package com.example.androidclient; import android.content.Intent; import android.os.Bundle; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import com.google.gson.Gson; import java.io.IOException; import okhttp3.Call; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; public class LoginActivity extends AppCompatActivity implements View.OnClickListener { private EditText tvUserName; private EditText tvPassword; private Button btnLogin; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); initView(); } private void initView() { tvUserName = (EditText) findViewById(R.id.tvUserName); tvPassword = (EditText) findViewById(R.id.tvPassword); btnLogin = (Button) findViewById(R.id.btnLogin); btnLogin.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btnLogin: submit(); break; } } private void submit() { // validate String tvUserNameString = tvUserName.getText().toString().trim(); if (TextUtils.isEmpty(tvUserNameString)) { Toast.makeText(this, "請(qǐng)輸入用戶名", Toast.LENGTH_SHORT).show(); return; } String tvPasswordString = tvPassword.getText().toString().trim(); if (TextUtils.isEmpty(tvPasswordString)) { Toast.makeText(this, "請(qǐng)輸入密碼", Toast.LENGTH_SHORT).show(); return; } // TODO validate success, do something InternetSever(tvUserNameString,tvPasswordString); } private void InternetSever(String username,String password) { OkHttpClient client = new OkHttpClient(); FormBody body = new FormBody.Builder() .add("username", username) .add("password", password) .build(); final Request request = new Request.Builder() .url("http://192.168.0.104:8000/login/") .post(body) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Toast.makeText(LoginActivity.this, "網(wǎng)絡(luò)異常,請(qǐng)稍后再試!", Toast.LENGTH_SHORT).show(); } @Override public void onResponse(Call call, Response response) throws IOException { final String date=response.body().string(); runOnUiThread(new Runnable() { @Override public void run() { Gson gson=new Gson(); Login_cs login_cs=gson.fromJson(date,Login_cs.class); if (login_cs.get_$StatusCode185()==200){ Toast.makeText(LoginActivity.this, "歡迎登錄,"+login_cs.getAdminname(), Toast.LENGTH_SHORT).show(); startActivity(new Intent(LoginActivity.this,MainActivity.class)); }else { Toast.makeText(LoginActivity.this, login_cs.getCode(), Toast.LENGTH_SHORT).show(); tvPassword.setText(""); tvUserName.setText(""); } } }); } }); } }
客戶端完成
4.測(cè)試
完成,如有問題晴留言給我哦!
服務(wù)器端源碼:https://github.com/ldy731729142/androidSevers
客戶端源碼:https://github.com/ldy731729142/AndroidClient
到此這篇關(guān)于Django(python)簡(jiǎn)單實(shí)現(xiàn)android的服務(wù)器端的文章就介紹到這了,更多相關(guān)Django實(shí)現(xiàn)android的服務(wù)器端內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用python采集腳本之家電子書資源并自動(dòng)下載到本地的實(shí)例腳本
這篇文章主要介紹了python采集jb51電子書資源并自動(dòng)下載到本地實(shí)例教程,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10Python實(shí)現(xiàn)的多線程http壓力測(cè)試代碼
這篇文章主要介紹了Python實(shí)現(xiàn)的多線程http壓力測(cè)試代碼,結(jié)合實(shí)例形式分析了Python多線程操作的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-02-02python的random模塊及加權(quán)隨機(jī)算法的python實(shí)現(xiàn)方法
下面小編就為大家?guī)硪黄猵ython的random模塊及加權(quán)隨機(jī)算法的python實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01詳解KMP算法以及python如何實(shí)現(xiàn)
這篇文章主要介紹了KMP算法的相關(guān)知識(shí)以及python如何實(shí)現(xiàn),幫助大家更好的進(jìn)行數(shù)據(jù)分析,感興趣的朋友可以了解下2020-09-09Python爬蟲抓取技術(shù)的一些經(jīng)驗(yàn)
這篇文章主要介紹了Python爬蟲抓取技術(shù)的一些經(jīng)驗(yàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07Python之tkinter文字區(qū)域Text使用及說明
這篇文章主要介紹了Python之tkinter文字區(qū)域Text使用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05Python?如何將?matplotlib?圖表集成進(jìn)到PDF?中
這篇文章主要介紹了Python?如何將?matplotlib?圖表集成進(jìn)到PDF?中,文章介紹內(nèi)容詳細(xì),具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助2022-03-03pandas round方法保留兩位小數(shù)的設(shè)置實(shí)現(xiàn)
本文主要介紹了pandas round方法保留兩位小數(shù)的設(shè)置實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08