pip 国内源:
阿里云 http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣 http://pypi.douban.com/simple/
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
然后输入如下命令
pip install tensorflow -i https://pypi.tuna.tsinghua.edu.cn/simple/
一、创建虚拟环境
安装虚拟环境工具
sudo apt-get install virtualenvsudo apt-get install virtualenvwrapper
将虚拟环境命令添加到环境变量:
#首先确定是否安装了vim,没有则安装,有则更新sudo apt-get install vim#打开.bahsrc 将代码添加到最后一行sudo vi ~/.bashrc#将下面的内容添加到最后一行,添加完成后重新打开终端source /usr/share/virtualenvwrapper/virtualenvwrapper.sh#退出保存,vim 底行模式:x#刷新环境source ~/.bashrc#测试是否正常,输入work 按两下tab键会发现自动补全workon即可,如果没有出现请重复上面的内容workon

2、创建虚拟环境
虚拟环境相常用命令如下:
#创建虚拟环境:mkvirtualenv「项目名字」#删除虚拟环境:rmvirtualenv 「项目名字」#进入虚拟环境:workon 「项目名字」#退出虚拟环境:deavtivate
创建一个新的虚拟环境,使用命令请使用tab补全的方式:
进入虚拟环境后查看当前虚拟环境下的pip包都有哪些
#pip相关命令#显示当前包名:pip list#显示扩展包名:pip freeze#安装包:pip install 包名#安装包:pip install 包名==版本号#修改软件源 :pip install Django==2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple Django==2.2#删除包:pip uninstall 包名
安装Django2.2
测试Django版本
#进如python解释器执行如下代码>>> import django>>> django.get_version()'2.2'>>>>>> exit()
二、创建Django工程
前言:执行之前必须对Django有些了解,了解它的M(模型)V(视图)T(模板)的模式,对于我们开发WEB,每一种功能或者说每一个网页分别都对应一个APP要有一些概念,更深入的了解请在视频中查看。
创建工程命令
#在虚拟环境下执行django-admin startproject 项目名称#创建完成后,当前目录下会产生对应得一个目录,可以看到如下内容:#这是Django给我们提供的一个基础配置,我们可以根据不同的需求去修改不同的文件#对于修改Python文件来说,PycharmIDE是少不了的,下面继续安装Pycharm工具(河蟹版)
安装IDE
链接:https://pan.baidu.com/s/1ind573d4O5I1ANsw7h44wg
提取码:9yl0
#复制该内容ThisCrackLicenseId-{ "licenseId":"11011", "licenseeName":"WeChat", "assigneeName":"IT--Pig", "assigneeEmail":"1113449881@qq.com", "licenseRestriction":"", "checkConcurrentUse":false, "products":[ {"code":"II","paidUpTo":"2099-12-31"}, {"code":"DM","paidUpTo":"2099-12-31"}, {"code":"AC","paidUpTo":"2099-12-31"}, {"code":"RS0","paidUpTo":"2099-12-31"}, {"code":"WS","paidUpTo":"2099-12-31"}, {"code":"DPN","paidUpTo":"2099-12-31"}, {"code":"RC","paidUpTo":"2099-12-31"}, {"code":"PS","paidUpTo":"2099-12-31"}, {"code":"DC","paidUpTo":"2099-12-31"}, {"code":"RM","paidUpTo":"2099-12-31"}, {"code":"CL","paidUpTo":"2099-12-31"}, {"code":"PC","paidUpTo":"2099-12-31"} ], "hash":"2911276/0", "gracePeriodDays":7, "autoProlongated":false}
打开工程
三、数据库配置
- settings.py文件中,通过DATABASES项目进行数据库设置,默认使用SQLite

- 其他数据库配置文档在上方链接中体现:https://docs.djangoproject.com/en/2.2/ref/settings/#databases
- 根据提示,修改成Mysql数据库

- 创建一个应用,在Models.py中布局数据类,python manage.py startapp 「应用名字」
注:安装mysqlclient失败解决办法
#首先确定安装pythond开发包sudo apt-get install python3-dev#进入虚拟环境安装mysqlclient,使用豆瓣源pip install mysqlclient -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com
测试搭建是否成功
#进入虚拟环境zhaolc@zhaolc-virtual-machine:~/demo$ workon myenv#运行服务器(myenv) zhaolc@zhaolc-virtual-machine:~/demo$ python manage.py runserver

浏览器出现以上内容代表搭建成功,如果失败请重复上面的内容。
初步验证已经实现了,下一步就要去定制Django了,通过修改源码和创建app的形式完成我们想要的功能。
四、定制Django界面功能
在上面的内容创建index(首页)的应用,接下来完善一下这个应用,访问要有首页的感觉,这里就需要用到模板了,模板其实就是在浏览网页中呈现出来的html,模板的路径也是在settings.py中描述。
1、显示首页HTML应用(app)
如果我们创建了新的应用,就需要在应用列表中去注册应用,相应的位置填写上自己的应用名字:
下图描述了模板的相关信息,通常只需要在项目根目录创建一个template即可。

随后网上下载一份html模板(自己写也行)放到这个目录下,这里给大家提供一份网上下载的模板,后期通过这个模板进行更改内容:
链接:https://pan.baidu.com/s/1ceugjspd38ZTZKoMW_pycg
提取码:3krh 

下面就需要去显示网页的相关内容,在此内容之前,需要自行去了解一下GET方法和POST方法,后面的内容会经常用到,此内容在实验完成后自行学习即可,下面跟着文档的操作:
pycharm环境修改:
编写视图文件
编辑URL
运行服务器测试界面

setings.py 最后一行修改文件所在位置
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static').replace('\\', '/'),os.path.join(BASE_DIR,).replace('\\', '/'),)
添加CSS样式目录




将所有路径进行修改,重新运行服务器,看到如下效果就搞定了。
2、注册功能实现(app)
每个标题都添加一个括号app的标识,是因为想让大家记得,每一个界面或者每一个功能就是对应一个app来实现的,现在网站的首页可以展示了,下面来实现注册界面。
————————————————————————————-注册显示页———————————————————————————-
#创建app(myenv) zhaolc@zhaolc-virtual-machine:~/demo$ python manage.py startapp register#添加app到settings.py# Application definitionINSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','index','register', #每创建一个就要在此]
修改模型,模型其实就是对应的数据库中的内容,在Django中,操作对象即操作数据库,他们之间是一种映射关系,带来的方便就是让我们无需考虑SQL语句,直接操作对象即可,大大减小了数据库管理的复杂度,下面跟我一起把注册功能所需要的数据库内容进行书写。
#说明:将该代码写入到register目录下的models.py中from django.db import modelsclass User_Info(models.Model): #创建一个用户类,继承models的Model,对应它会在数据库中生成对应的表#成员类型,则对应会在表中生成对应的字段User = models.CharField(max_length=18) #用户名,字符串类型,最长18Password = models.CharField(max_length=64) #密码Tel = models.CharField(max_length=20) #电话Company = models.CharField(max_length=30) #公司Other = models.CharField(max_length=300) #其他#非注册可见数据CreateData = models.DateTimeField(auto_now=True) #注册日期,自动记录LoginData = models.DateTimeField(auto_now=True) #登录日期LoginIP = models.CharField(max_length=16) #登录IPRegisterIP = models.CharField(max_length=16) #注册IPCheckKey = models.CharField(max_length=32) #密钥,后期实现用来密码加密,每个用户都不同def __str__(self):return self.CheckKey #调用该表,返回密钥,当然也可以返回用户名,将CheckKey换成User即可# Create your models here.

接下来要实现一下对应的url,在浏览器输入127.0.0.1:8000/register时,要进入对应的注册界面,首先在register应用目录下创建一个urls.py,随后在工程目录下的url中添加register的url目标转向,将目标转到register应用中的urls:
#---------工程目录下的urls.py---------from django.contrib import adminfrom django.urls import path, includefrom index import viewsurlpatterns = [path('', views.index), #对应访问路径127.0.0.1:8000path('register/' , include('register.urls')), #将目标转到register应用中的urls,对应访问路径127.0.0.1:8000/registerpath('admin/', admin.site.urls),#对应访问路径127.0.0.1:8000/admin]#---------register应用目录下的urls.py---------from django.urls import pathurlpatterns = [path('', views.register), #对应的处理方法在views中添加register进行处理]
urls.py处理完成之后,需要在视图中进行处理了,当用户访问对应的url时就会触发对应的views中的方法来给用户返回对应的html界面,下面的代码则是register应用中views.py的代码:
注:register.html已经更新到模板网页当中,请自行检查
#---------register应用目录下的views.py---------from django.shortcuts import renderdef register(request):return render(request,'register.html') #此前拷贝的html并没有这个界面,需要在次复制进来# Create your views here.

代码编写完成,首先需要将配置的对象生成对应的数据库表以及字段,需要用到两个命令:
#创建迁移数据(myenv) zhaolc@zhaolc-virtual-machine:~/demo$ python manage.py makemigrations#迁移数据(myenv) zhaolc@zhaolc-virtual-machine:~/demo$ python manage.py migrate

此时运行服务器,点击注册,即可出现相应的界面,但是还不能注册,稍后进行注册的代码编写,打开网页成功的同时,也打开下Mysql的管理工具,查看mysql下是否出现了对应的表,并查看是否有对应的字段结构。
————————————————————————————-注册显示页END———————————————————————————-
————————————————————————————-注册功能实现————————————————————————————-
注册功能实现:
#register/views.pyimport randomimport string#获取随机值def get_random(n=32):#默认参数32,此函数可用于加密和验证码all_chs = string.digits + string.ascii_lettersresult = ''for i in range(n):ch = random.choice(all_chs)result += chreturn result#hmacSH1加密def get_hash(key,code,sha):hmac_code = hmac.new(key.encode(), code.encode(), sha)return hmac_code.hexdigest()#注册方法实现def register(request): #用户请求if request.method == 'GET': #如果是GET方法,则返回界面global checknu #使用全局变量checkNUM = get_random(4) #重新赋值验证码context = {'check':checkNUM} #创建字典return render(request,'register.html',context) #返回界面和验证码#如果不是GET则是POSTuser = request.POST.get('user') #获取网页信息pwd = request.POST.get('password')pwd2 = request.POST.get('checkpassword')tel = request.POST.get('tel')company = request.POST.get('company')other = request.POST.get('other')check_index = request.POST.get('check')#判断验证码是否正确if check_index != checkNUM:return HttpResponse('验证码错误')#查询数据库,该用户是否存在ret = User_Info.objects.filter(User=user).count()if ret != 0:return HttpResponse('用户名已存在')#判断两次密码是否一致if pwd != pwd2 :return HttpResponse('两次密码输入不一致')#创建用户对象进行赋值Create_user = User_Info()Create_user.User = userTempKey = get_random() #获取随机32位值Create_user.CheckKey = TempKeyCreate_user.Password = get_hash(TempKey,pwd) #加密密码Create_user.Company = companyCreate_user.Tel = telCreate_user.Other = otherCreate_user.LoginIP = request.META['REMOTE_ADDR']Create_user.RegisterIP = request.META['REMOTE_ADDR'] #获取当前用户IPif Create_user.save(): #保存,相当于写数据库return HttpResponse('服务器异常,请重试')return HttpResponse('注册成功')
————————————————————————————-注册功能实现END————————————————————————————-
登录功能实现
————————————————————————————-注册功能实现————————————————————————————-
python manage.py startapp login #创建登录app
#login目录下创建urls.py填写如下代码:
from django.urls import path
from login import views
urlpatterns = [
path('',views.login)
]
#工程setings.py 添加APP名称
#工程urls.py 添加新url
#login下views.py代码如下
from django.http import HttpResponse
from django.shortcuts import render
from register.models import User_Info
from register.views import get_hash
def login(request):
if request.method == 'GET':
return render(request,'login.html')
user = request.POST.get('user')
password = request.POST.get('password')
ret = User_Info.objects.filter(User=user).count()
if ret == 0:
return HttpResponse('用户不存在')
ret = User_Info.objects.get(User=user)
pwd = get_hash(ret.CheckKey,password)
if ret.Password != pwd:
return HttpResponse('密码错误')
context = {'show_user': user}
return render(request,'index_in.html',context)
————————————————————————————-注册功能实现END————————————————————————————-
myfifo信息
————————————————————————————-数据信息展示————————————————————————————-
from django.http import HttpResponse
from django.shortcuts import render
from createproduct.models import Product
from device.models import DeviceInfo
from register.models import User_Info
from topic.models import Topic_Info
def myinfo(request):
context = {'show_user':request.POST.get('username')}
ret = User_Info.objects.get(User=request.POST.get('username'))
rest = Product.objects.filter(P_User=ret.id).count()
if rest == 0:
return render(request, 'myinfo.html', context)
rest = Product.objects.filter(P_User=ret.id)
context['show_user'] = request.POST.get('username')
context['list'] = rest
return render(request,'myinfo.html',context)
def show(request,id):
ret = Product.objects.get(id=id)
username = User_Info.objects.get(id=ret.P_User_id)
context = {'show_user':username.User}
context['productname'] = ret.P_Name
context['notetype'] = ret.P_NodeType
context['type'] = ret.P_Type
context['link'] = ret.P_Link
context['dataformat'] = ret.P_DataFormat
context['authentication'] = ret.P_Authentication
context['data'] = ret.P_CreateData
context['status'] = ret.P_Status
context['productkey'] = ret.P_ProductKey
context['productsecret'] = ret.P_ProductSecret
#查询设备代码
ret = DeviceInfo.objects.filter(D_User_id=ret.P_User_id,D_Product_id=ret.id)
# return HttpResponse(username.User)
context['list_dev'] = ret;
return render(request,'mydevice.html',context)
def createdevice(request):
context = {'show_user':request.POST.get('username')}
context['productname'] = request.POST.get('product')
return render(request,'create_device.html',context)
def creatediviceinfo(request):
newDevice = DeviceInfo()
newDevice.D_Name = request.POST.get('devicename')
newDevice.D_Describe = request.POST.get('describe')
ret = Product.objects.get(P_Name=request.POST.get('product'))
newDevice.D_Product = ret
ret = User_Info.objects.get(User=request.POST.get('username'))
newDevice.D_User = ret
if newDevice.save():
return HttpResponse('Create Device is Fail')
createTopic(newDevice.D_Name,request.POST.get('product'),request.POST.get('username'),request.POST.get('productkey'))
return HttpResponse('is ok')
# Create your views here.
def createTopic(devicename,productname,user,key):
newTopci = Topic_Info()
newTopci.T_Name = '固件版本'
newTopci.T_Dir = '/ota/device/interface/' + key + '/' + devicename + '/'
newTopci.T_Permission = '订阅'
ret = Product.objects.get(P_Name=productname)
newTopci.T_Product = ret
ret = User_Info.objects.get(User=user)
newTopci.T_User = ret
ret = DeviceInfo.objects.get(D_Name=devicename,D_User_id=ret.id)
newTopci.T_Device = ret
newTopci.save()
#更多功能在此处进行添加即可
def show_dev(request,id):
#Get方法返回网页
if request.method == 'GET':
ret = DeviceInfo.objects.get(id = id)
username = User_Info.objects.get(id = ret.D_User_id)
context = {'d_name':ret.D_Name}
context['d_stats'] = ret.D_Stats
context['show_user'] = username.User
toptemp = Topic_Info.objects.filter(T_Device_id=id)
context['list_topic'] = toptemp
return render(request,'device_info.html',context)
#POST方法获取from表单填写
newTopic = Topic_Info()
newTopic.T_Name = request.POST.get('topic_name')
newTopic.T_DataName = request.POST.get('t_dataname')
ret = DeviceInfo.objects.get(id=id)
ret = Product.objects.get(id=ret.D_Product_id)
newTopic.T_Dir = '/system/' + ret.P_ProductKey + '/event/' + newTopic.T_DataName
newTopic.T_Permission = request.POST.get('pe')
newTopic.T_Data = 0
newTopic.T_Device_id = id
newTopic.T_Product_id = ret.id
newTopic.T_User = User_Info.objects.get(id=ret.P_User_id)
if newTopic.save():
return HttpResponse('创建失败')
ret = DeviceInfo.objects.get(id=id)
username = User_Info.objects.get(id=ret.D_User_id)
context = {'d_name': ret.D_Name}
context['d_stats'] = ret.D_Stats
context['show_user'] = username.User
toptemp = Topic_Info.objects.filter(T_Device_id=id)
context['list_topic'] = toptemp
return render(request, 'device_info.html', context)
- 数据库定义在models.py中直接书写class即可,相关联的数据库和SQL语句它会在执行的时候自动帮我们创建
```python
在models.py中书写代码
from django.db import models让自己定义的类去继承django提供的modle类
class UserInfo(models.Model): #类名代表表的名字,成员代表字段的名字 cUser = models.CharField(maxlength=20) #必须使用models提供的类型 cPassword = models.CharField(maxlength=18) cData = models.DateTimeField() def __str(self):return self.cUser
在创建一个相互关联的数据库,比如,我当前用户下创建了多个设备,其中就需要多种数据库关联
class DeviceInfo(models.Model): dName = models.CharField(maxlength=20) dDescribe = models.CharField(maxlength=300) dProductKey = models.CharField(max_length=16) dProductSecret = models.CharField(max_length=16) dCreateData = models.DateTimeField() dUpdateData = models.DateTimeField() dNum = models.IntegerField() dUser = models.ForeignKey(UserInfo, on_delete=models.CASCADE)#关联键 def __str(self): return self.dName
- 代码写好后进行先测试下数据库能否跑起来,启动服务器
```python
#进入虚拟环境,执行
(myserver) $ python manage.py runserver #默认8000端口 可以自己指定

- 注册app后,将数据进行迁移,执行如下代码
```python
执行创建迁移文件动作
(myserver) $ python manage.py makemigrations Migrations for ‘sql_app’:sql_app/migrations/0001_initial.py - Create model UserInfo - Create model DeviceInfo
(myserver) $ python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions, sql_app Running migrations: Applying contenttypes.0001_initial… OK Applying auth.0001_initial… OK Applying admin.0001_initial… OK Applying admin.0002_logentry_remove_auto_add… OK Applying admin.0003_logentry_add_action_flag_choices… OK Applying contenttypes.0002_remove_content_type_name… OK Applying auth.0002_alter_permission_name_max_length… OK Applying auth.0003_alter_user_email_max_length… OK Applying auth.0004_alter_user_username_opts… OK Applying auth.0005_alter_user_last_login_null… OK Applying auth.0006_require_contenttypes_0002… OK Applying auth.0007_alter_validators_add_error_messages… OK Applying auth.0008_alter_user_username_max_length… OK Applying auth.0009_alter_user_last_name_max_length… OK Applying auth.0010_alter_group_name_max_length… OK Applying auth.0011_update_proxy_permissions… OK Applying sessions.0001_initial… OK Applying sql_app.0001_initial… OK
- 数据库管理,添加后台超级用户,进行对数据库的管理
```python
(myserver) $ python manage.py createsuperuser #添加超级用户
Username (leave blank to use 'zhaolc'): admin
Email address: admin@admin.com
Password:
Password (again):
The password is too similar to the username.
This password is too short. It must contain at least 8 characters.
This password is too common.
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
(myserver) $ python manage.py runserver
像admin注册数据库模型,应用目录下admin.py修改
#sql_app/admin.py from djangp.contrlb improt admin from .models improt * admin.site.register(UserInfo) admin.site.register(DeviceInfo)登录后台管理:http://127.0.0.1:8000/admin 输入创建的账号密码进入

三、Django命令与使用
创建项目:
python manmage.py startproject 「项目名字」
#会在当前目录下产生一个项目的文件夹,并且提供基础功能
创建应用
python manage.py startapp 「应用名字」
python manage.py runserver 启动服务
python manage.py makemigrations 生成迁移(生成数据库语句)
sudo apt-get install php7.4
php -v
sudo apt-get install libapache2-mod-php7.4
nodejs 需要安装npm
sudo npm install mysql






















