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/

一、创建虚拟环境

安装虚拟环境工具

  1. sudo apt-get install virtualenv
  2. sudo apt-get install virtualenvwrapper

将虚拟环境命令添加到环境变量:

  1. #首先确定是否安装了vim,没有则安装,有则更新
  2. sudo apt-get install vim
  3. #打开.bahsrc 将代码添加到最后一行
  4. sudo vi ~/.bashrc
  5. #将下面的内容添加到最后一行,添加完成后重新打开终端
  6. source /usr/share/virtualenvwrapper/virtualenvwrapper.sh
  7. #退出保存,vim 底行模式:x
  8. #刷新环境
  9. source ~/.bashrc
  10. #测试是否正常,输入work 按两下tab键会发现自动补全workon即可,如果没有出现请重复上面的内容
  11. workon

image.png

2、创建虚拟环境

虚拟环境相常用命令如下:

  1. #创建虚拟环境:mkvirtualenv「项目名字」
  2. #删除虚拟环境:rmvirtualenv 「项目名字」
  3. #进入虚拟环境:workon 「项目名字」
  4. #退出虚拟环境:deavtivate

创建一个新的虚拟环境,使用命令请使用tab补全的方式:

image.png

进入虚拟环境后查看当前虚拟环境下的pip包都有哪些

  1. #pip相关命令
  2. #显示当前包名:pip list
  3. #显示扩展包名:pip freeze
  4. #安装包:pip install 包名
  5. #安装包:pip install 包名==版本号
  6. #修改软件源 :pip install Django==2.2 -i https://pypi.tuna.tsinghua.edu.cn/simple Django==2.2
  7. #删除包:pip uninstall 包名

image.png

安装Django2.2

image.png

测试Django版本

  1. #进如python解释器执行如下代码
  2. >>> import django
  3. >>> django.get_version()
  4. '2.2'
  5. >>>
  6. >>> exit()

image.png

二、创建Django工程

前言:执行之前必须对Django有些了解,了解它的M(模型)V(视图)T(模板)的模式,对于我们开发WEB,每一种功能或者说每一个网页分别都对应一个APP要有一些概念,更深入的了解请在视频中查看。

创建工程命令

  1. #在虚拟环境下执行
  2. django-admin startproject 项目名称
  3. #创建完成后,当前目录下会产生对应得一个目录,可以看到如下内容:
  4. #这是Django给我们提供的一个基础配置,我们可以根据不同的需求去修改不同的文件
  5. #对于修改Python文件来说,PycharmIDE是少不了的,下面继续安装Pycharm工具(河蟹版)

image.png

安装IDE

链接:https://pan.baidu.com/s/1ind573d4O5I1ANsw7h44wg
提取码:9yl0
image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

  1. #复制该内容
  2. 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}

image.png

image.png

打开工程

image.png
image.png
image.png

三、数据库配置

  • settings.py文件中,通过DATABASES项目进行数据库设置,默认使用SQLite

image.png

image.png

  • 创建一个应用,在Models.py中布局数据类,python manage.py startapp 「应用名字」

image.png
image.png

注:安装mysqlclient失败解决办法

  1. #首先确定安装pythond开发包
  2. sudo apt-get install python3-dev
  3. #进入虚拟环境安装mysqlclient,使用豆瓣源
  4. pip install mysqlclient -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

测试搭建是否成功

  1. #进入虚拟环境
  2. zhaolc@zhaolc-virtual-machine:~/demo$ workon myenv
  3. #运行服务器
  4. (myenv) zhaolc@zhaolc-virtual-machine:~/demo$ python manage.py runserver

image.png
浏览器出现以上内容代表搭建成功,如果失败请重复上面的内容。
初步验证已经实现了,下一步就要去定制Django了,通过修改源码和创建app的形式完成我们想要的功能。

四、定制Django界面功能

在上面的内容创建index(首页)的应用,接下来完善一下这个应用,访问要有首页的感觉,这里就需要用到模板了,模板其实就是在浏览网页中呈现出来的html,模板的路径也是在settings.py中描述。

1、显示首页HTML应用(app)

如果我们创建了新的应用,就需要在应用列表中去注册应用,相应的位置填写上自己的应用名字:
image.png
下图描述了模板的相关信息,通常只需要在项目根目录创建一个template即可。
image.png
image.png
随后网上下载一份html模板(自己写也行)放到这个目录下,这里给大家提供一份网上下载的模板,后期通过这个模板进行更改内容:
链接:https://pan.baidu.com/s/1ceugjspd38ZTZKoMW_pycg
提取码:3krh
image.png
image.png
下面就需要去显示网页的相关内容,在此内容之前,需要自行去了解一下GET方法和POST方法,后面的内容会经常用到,此内容在实验完成后自行学习即可,下面跟着文档的操作:

pycharm环境修改:

image.png
image.png
image.png

编写视图文件

image.png

编辑URL

image.png

运行服务器测试界面

image.png

setings.py 最后一行修改文件所在位置

  1. STATICFILES_DIRS = (
  2. os.path.join(BASE_DIR, 'static').replace('\\', '/'),
  3. os.path.join(BASE_DIR,).replace('\\', '/'),
  4. )

添加CSS样式目录

image.png
image.png
image.png
image.png
将所有路径进行修改,重新运行服务器,看到如下效果就搞定了。
image.png

2、注册功能实现(app)

每个标题都添加一个括号app的标识,是因为想让大家记得,每一个界面或者每一个功能就是对应一个app来实现的,现在网站的首页可以展示了,下面来实现注册界面。
————————————————————————————-注册显示页———————————————————————————-

  1. #创建app
  2. (myenv) zhaolc@zhaolc-virtual-machine:~/demo$ python manage.py startapp register
  3. #添加app到settings.py
  4. # Application definition
  5. INSTALLED_APPS = [
  6. 'django.contrib.admin',
  7. 'django.contrib.auth',
  8. 'django.contrib.contenttypes',
  9. 'django.contrib.sessions',
  10. 'django.contrib.messages',
  11. 'django.contrib.staticfiles',
  12. 'index',
  13. 'register', #每创建一个就要在此
  14. ]

修改模型,模型其实就是对应的数据库中的内容,在Django中,操作对象即操作数据库,他们之间是一种映射关系,带来的方便就是让我们无需考虑SQL语句,直接操作对象即可,大大减小了数据库管理的复杂度,下面跟我一起把注册功能所需要的数据库内容进行书写。

  1. #说明:将该代码写入到register目录下的models.py中
  2. from django.db import models
  3. class User_Info(models.Model): #创建一个用户类,继承models的Model,对应它会在数据库中生成对应的表
  4. #成员类型,则对应会在表中生成对应的字段
  5. User = models.CharField(max_length=18) #用户名,字符串类型,最长18
  6. Password = models.CharField(max_length=64) #密码
  7. Tel = models.CharField(max_length=20) #电话
  8. Company = models.CharField(max_length=30) #公司
  9. Other = models.CharField(max_length=300) #其他
  10. #非注册可见数据
  11. CreateData = models.DateTimeField(auto_now=True) #注册日期,自动记录
  12. LoginData = models.DateTimeField(auto_now=True) #登录日期
  13. LoginIP = models.CharField(max_length=16) #登录IP
  14. RegisterIP = models.CharField(max_length=16) #注册IP
  15. CheckKey = models.CharField(max_length=32) #密钥,后期实现用来密码加密,每个用户都不同
  16. def __str__(self):
  17. return self.CheckKey #调用该表,返回密钥,当然也可以返回用户名,将CheckKey换成User即可
  18. # Create your models here.

image.png
接下来要实现一下对应的url,在浏览器输入127.0.0.1:8000/register时,要进入对应的注册界面,首先在register应用目录下创建一个urls.py,随后在工程目录下的url中添加register的url目标转向,将目标转到register应用中的urls:

  1. #---------工程目录下的urls.py---------
  2. from django.contrib import admin
  3. from django.urls import path, include
  4. from index import views
  5. urlpatterns = [
  6. path('', views.index), #对应访问路径127.0.0.1:8000
  7. path('register/' , include('register.urls')), #将目标转到register应用中的urls,对应访问路径127.0.0.1:8000/register
  8. path('admin/', admin.site.urls),#对应访问路径127.0.0.1:8000/admin
  9. ]
  10. #---------register应用目录下的urls.py---------
  11. from django.urls import path
  12. urlpatterns = [
  13. path('', views.register), #对应的处理方法在views中添加register进行处理
  14. ]

urls.py处理完成之后,需要在视图中进行处理了,当用户访问对应的url时就会触发对应的views中的方法来给用户返回对应的html界面,下面的代码则是register应用中views.py的代码:
注:register.html已经更新到模板网页当中,请自行检查

  1. #---------register应用目录下的views.py---------
  2. from django.shortcuts import render
  3. def register(request):
  4. return render(request,'register.html') #此前拷贝的html并没有这个界面,需要在次复制进来
  5. # Create your views here.

image.png
代码编写完成,首先需要将配置的对象生成对应的数据库表以及字段,需要用到两个命令:

  1. #创建迁移数据
  2. (myenv) zhaolc@zhaolc-virtual-machine:~/demo$ python manage.py makemigrations
  3. #迁移数据
  4. (myenv) zhaolc@zhaolc-virtual-machine:~/demo$ python manage.py migrate

image.png
此时运行服务器,点击注册,即可出现相应的界面,但是还不能注册,稍后进行注册的代码编写,打开网页成功的同时,也打开下Mysql的管理工具,查看mysql下是否出现了对应的表,并查看是否有对应的字段结构。
image.png

————————————————————————————-注册显示页END———————————————————————————-

————————————————————————————-注册功能实现————————————————————————————-

注册功能实现:

  1. #register/views.py
  2. import random
  3. import string
  4. #获取随机值
  5. def get_random(n=32):#默认参数32,此函数可用于加密和验证码
  6. all_chs = string.digits + string.ascii_letters
  7. result = ''
  8. for i in range(n):
  9. ch = random.choice(all_chs)
  10. result += ch
  11. return result
  12. #hmacSH1加密
  13. def get_hash(key,code,sha):
  14. hmac_code = hmac.new(key.encode(), code.encode(), sha)
  15. return hmac_code.hexdigest()
  16. #注册方法实现
  17. def register(request): #用户请求
  18. if request.method == 'GET': #如果是GET方法,则返回界面
  19. global checknu #使用全局变量
  20. checkNUM = get_random(4) #重新赋值验证码
  21. context = {'check':checkNUM} #创建字典
  22. return render(request,'register.html',context) #返回界面和验证码
  23. #如果不是GET则是POST
  24. user = request.POST.get('user') #获取网页信息
  25. pwd = request.POST.get('password')
  26. pwd2 = request.POST.get('checkpassword')
  27. tel = request.POST.get('tel')
  28. company = request.POST.get('company')
  29. other = request.POST.get('other')
  30. check_index = request.POST.get('check')
  31. #判断验证码是否正确
  32. if check_index != checkNUM:
  33. return HttpResponse('验证码错误')
  34. #查询数据库,该用户是否存在
  35. ret = User_Info.objects.filter(User=user).count()
  36. if ret != 0:
  37. return HttpResponse('用户名已存在')
  38. #判断两次密码是否一致
  39. if pwd != pwd2 :
  40. return HttpResponse('两次密码输入不一致')
  41. #创建用户对象进行赋值
  42. Create_user = User_Info()
  43. Create_user.User = user
  44. TempKey = get_random() #获取随机32位值
  45. Create_user.CheckKey = TempKey
  46. Create_user.Password = get_hash(TempKey,pwd) #加密密码
  47. Create_user.Company = company
  48. Create_user.Tel = tel
  49. Create_user.Other = other
  50. Create_user.LoginIP = request.META['REMOTE_ADDR']
  51. Create_user.RegisterIP = request.META['REMOTE_ADDR'] #获取当前用户IP
  52. if Create_user.save(): #保存,相当于写数据库
  53. return HttpResponse('服务器异常,请重试')
  54. 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)

image.png

  • 数据库定义在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端口 可以自己指定

image.png

  • 进入该网页,显示如下图即,服务器已经正常运行

    image.png

  • 服务器成功后,需要将写好的app注册进去,操作如下:

image.png

  • 注册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 输入创建的账号密码进入

image.png

三、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