百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

从安装包到云平台,Python Django+MySQL攻略

toyiye 2024-06-21 12:14 8 浏览 0 评论

#python#

#Django#

*django+mysql创建用户管理系统

1、创建django项目

(1)用pycharm创建

PyCharm开源社区版不像商业版那样可以直接通过Django来创建项目,必须通过以下几个步骤进行:

1. 创建项目:cmd命令先进入目录:cd E:\pj-python\pj01,再在cmd命令行下输入:django-admin startproject pj001 (cmd命令先进入目录:cd E:\pj-python\pj01)

2. 导入项目:打开Pycharm,open,选择刚才创建的项目

3. 创建应用:先在cmd命令行下进入demo所在目录:cd E:\pj-python\pj01\pj001,然后在cmd命令行下输入:python manage.py startapp app001 (cmd命令下先进入pj001所在的目录)

或者在pycharm的terminal界面也跟cmd一样。

4. 查看目录:


(3)各文件介绍

“项目名/项目名/”下有:

_init_.py -->记得加入处理mysql连接的语句

index.py(我自己建的)

settings.py :在installed_apps部分要加入自己创建的应用名,database部分设置好与mysql的连接,static部分加上staticfiles_dirs

urls.py :在urlpatterns部分设置好要访问的url和views中函数的对应关系

wsgi.py:一般不要动

新建一个应用,下面会有:

migrations文件夹:暂时不要动;‘

_init_.py:暂时不要动

admin.py:

apps.py:

forms.py: 我自己加的

models.py: 如果需要创建数据表就要在这里面写,然后用python manage.py makemigrations和python manage.py migrate在mysql数据库中生成真实的表。

tests.py:

views.py: 可获取models中定义的表的数据,import models,...


2、安装mysql server

网上攻略很多,不载累述


3、创建数据库和用户

进入mysql数据库目录:C:\Program Files (x86)\MySQL\MySQL Server 5.7\bin>

输入mysql -h localhost -u root -p进入数据库

密码:123456

mysql>create database 数据库名;

mysql>create user 用户名@localhost identified by '123456';

mysql>grant all privileges on 数据库.* to 用户名@localhost;

Ctrl+z退出


4、设置数据库连接

如遇到如下问题

django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.

Did you install mysqlclient?

解决方案:

(1) 安装pymsql

pip install pymysql

(2) 安装完毕,打开项目的_init_.py,添加代码:

import pymysql

pymysql.install_as_MySQLdb()


5、创建数据表(数据迁移)

(1)选择某个应用

(2)在其models.py中定义表结构,

(3)在其admin.py中注册表

(4)数据迁移:python manage.py makemigrations  应用名
                          python manage.py migrate
如出现RuntimeError: cryptography is required for sha256_password or ....
执行如下操作:
1). ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; #修改加密规则 
2).ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; #更新一下用户的密码
3).FLUSH PRIVILEGES; #刷新权限
4).再重置下密码:alter user 'root'@'localhost' identified by '123456';


6、安装captcha

pip install django-simple-captcha

settings.py配置,加入captcha

INSTALLED_APPS = [

'captcha',

]

urls.py配置

加入url
from django.urls import path,include
path('captcha', include('captcha.urls')),

————————————————

错误一:No module named 'MySQLdb'

原因:python3连接MySQL不能再使用mysqldb,取而代之的是pymysql。

解决方法:在python的MySQL包中,即路径:C:\Users\adong\AppData\Local\Programs\Python\Python36\Lib\site-packages\Django-2.0.3-py3.6.egg\django\db\backends\mysql

下的__init__.py文件中加入:

import pymysql

pymysql.install_as_MySQLdb()


错误二:django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11.None

原因:在解决了错误一以后出现了此错误。

解决方法:在python的MySQL包中,即路径:C:\Users\adong\AppData\Local\Programs\Python\Python36\Lib\site-packages\Django-2.0.3-py3.6.egg\django\db\backends\mysql

下的 base.py 文件中,注释掉一下两行代码:

if version < (1, 3, 3):
raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)


settings.py文件中修改数据库配置为下面的内容:


# Database

# https://docs.djangoproject.com/en/2.0/ref/settings/#databases


DATABASES = {

'default': {

'ENGINE': 'django.db.backends.mysql',

'HOST': '127.0.0.1',

'PORT': '3306',

'NAME': 'mysql',

'USER': 'root',

'PASSWORD': 'zwg123456',

'OPTIONS': {

'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",

},

}

}

驱动(ENGINE)、主机地址(HOST)、端口号(PORT)、数据库(NAME)、用户名(NAME)以及登录密码(PASSWORD);

二、在__init_.py文件添加如下配置:


# coding=utf-8


import pymysql

pymysql.install_as_MySQLdb()

因为Django连接MySQL时默认使用MySQLdb驱动,但MySQLdb不支持Python3,因此这里将MySQL驱动设置为pymysql。


三、执行数据迁移


在项目manage.py路劲下执行如下命令即可


python manage.py makemigrations

python manage.py migrate

————————————————

在利用models.py文件生成数据库表之前,我们需要手动的先创建数据库:

mysql> create database django_mysql;

创建完django_msql库之后,我们在终端执行如下命令,他的作用是将models文件生成一个迁移文件

python3 manage.py makemigrations

迁移文件生成完毕,执行


python manage.py migrate
django.db.utils.InternalError: (1060, "Duplicate column name 'user_id'")
一直出现这个问题,删除了migration文件里面的除了__int__.py以外的所有文件,继续执行,python manage.py migration,解决。
如果还不行,就用以下指令:
python manage.py migrate --fake
这个解决问题
————————————————

如果修改了models中的数据字段,,再次迁移:

python3 manage.py makemigrations --empty managerbook # managerbook就是你的app名字,此处要写成自己的app名字

python3 manage.py makemigrations # 再次正常运行生成迁移文件的命令

python3 manage.py migrate # 同步数据库

You are trying to add a non-nullable field 'name' to contact without a default; we can't do that (the database needs something to populate existing rows).

Please select a fix:

1) Provide a one-off default now (will be set on all existing rows with a null value for this column)

2) Quit, and let me add a default in models.py

Select an option:


解决方法:

先给'name'任意初始值:name = models.CharField(max_length=50, default='abc')

然后执行:python manage.py makemirations

再执行:python manage.py migrate


再将default删去,即执行:name = models.CharField(max_length=50)

执行:python manage.py makemirations

再执行:python manage.py migrate

解决!

注意:在开发过程中,数据库同步误操作之后,难免会遇到后面不能同步成功的情况,解决这个问题的一个简单粗暴方法是把migrations目录下的脚本(除__init__.py之外)全部删掉,再把数据库删掉之后创建一个新的数据库,数据库同步操作再重新做一遍。


7、从mysql数据库中查询数据展示在网页

实现逻辑:

用户访问html页面,urls.py负责找到相应的views中的函数,views中的函数负责提供数据用于展示在页面。

(1)在views.py中

import models

8、前后台交互

views中的函数,get:第一次转到该页面;post:提交该页面。


1、登录页面设计

在login.html中

<head>

    <script type="text/javascript" src="/static/js/jquery-3.4.1.js"></script>

  </head>
<div id="e_in" style="position:absolute; right:400px; top:700px">

    <form name="fm1" method="post" action="/../" >

        {% csrf_token %}

        <input name="uid" type="text" placeholder="user ID" style="。。。">

        <input name="ukey" type="password" placeholder="user KEY" style="。。。">

        <input type="submit" value="L O G I N"  style="position:absolute; left:0px; top:140px;height:40px;width:200px; background-color: #c0f0e0; font-size:25px;">

    </form>

  </div>
##注意form,注意action就是当前页面,method是post还是get将触发后台的动作,整个form由submit来触发。
##注意{% csrf_token %}。django默认启动 'django.middleware.csrf.CsrfViewMiddleware'中间件, 这个中间件就是来验证csrf_token的。如果没有加csrf_token,就会出错。
在view.py中
def login(request):

    loginfo = data_gen.login()

    userid = 0

    userkey = 0

    global qxpro

    global qxfunc

    if request.method == "POST":

        userid = request.POST.get("uid")

        userkey = request.POST.get("ukey")

        if (userid==loginfo.user01[0][0] and userkey==loginfo.user01[0][1]):

            qxpro = loginfo.user01[1]  

            qxfunc = loginfo.user01[2]

            response = HttpResponseRedirect('/index/')

            response.set_cookie("username", 'kdkj')

            return response

        elif (userid==loginfo.user02[0][0] and userkey==loginfo.user02[0][1]):

            qxpro = loginfo.user02[1]

            qxfunc = loginfo.user02[2]

            response = HttpResponseRedirect('/index/')

            response.set_cookie("username", 'shzf')

            return response

    return render(request, 'login.html')
在data_gen中
class login():

    user01 = (('kdkj','123456'),(1,1,1,0,0),(1,1,1,1,1,1,1,1,1))

    user02 = (('shzf', 'shzf'), (1, 1, 0, 0, 0), (1, 1, 1, 0, 0, 0, 1, 0, 0))  ###eb\pd\ac\gl\pv\es\tf\dd

    def __str__(self):

        return self.ID
###在类login中建立用户账号和权限


2、用户权限配置
View.Py:

  def login(request):

    loginfo = basic.log()

    username = 0

    userkey = 0


    if request.method == "POST":

        username = request.POST.get("uname")

        userkey = request.POST.get("ukey")

        try:

            userdoc = loginfo.user(username)

            if (userkey==userdoc[0][2])and(userdoc[1]=='free'):

                user_id =loginfo.login_set(username)

                print("cookie is |", user_id)

                request.session['userid'] = user_id   ##very import, session to store user ID

                response = HttpResponseRedirect('../index/')

                return response

            else:

                return render(request, 'login.html')

        except:

            return render(request, 'login.html')

  

    return render(request, 'login.html')
######################################################################################

  def logout(request):

    user_id = request.session.get('userid') ##get user ID from session

    loginfo = basic.log()

    obj = loginfo.logout_set(user_id) ##set user state as “free” in “user_doc” table

  

    return render(request, 'gate.html')
##################################################################################

  def acount(request):

    signinfo = basic.signon()

    username = 0

    userkey = 0

    userkey2 = 0

  

    if request.method == "POST":

        username = request.POST.get("uname")

        userkey = request.POST.get("ukey")

        userkey2 = request.POST.get("ukey2")

        try:

            if userkey == userkey2 and userkey != username and len(userkey) > 5:

                print(username)

                if signinfo.chk(username)==0:

                    type_def = 'free'

                    prj = "1001,1002"

                    ath = "1,0,0,0,0,0,0,0"

                    signinfo.sign(username, userkey, type_def, prj, ath)

                    response = HttpResponseRedirect('../login/')

                    return response

                else:

                    slogan = "YOUR NAME HAD BEEN SIGNED SIR!!"

                    return render(request, 'acount.html', {"slogan": slogan})

            else:

                slogan = "YOUR INFORMATION IS WRONG SIR!!"

                return render(request, 'acount.html', {"slogan": slogan})

        except:

            slogan = "Sorry Try Again SIR!!"

            return render(request, 'acount.html', {"slogan": slogan})

  

    slogan = "WELCOME SIR!!"

    return render(request, 'acount.html',{"slogan":slogan})
#####################################################################################

  def index(request):

    user_id = request.session.get('userid') ##get user ID from session

    print("user ID", user_id)

    loginfo = basic.log()

    user_auth = loginfo.log_chk(user_id) ##get more user information from “user_doc” table
 
 
Basic.py:
class log:

    def user(self,uname):

        obj = user_doc.objects.get(user_name=uname)

        user_type = obj.type

        user_proj = obj.proj.split(',')

        user_proj = list(map(int,user_proj))

        user_func = obj.auth.split(',')

        user_func = list(map(int, user_func))

  

        user = [[obj.ID,obj.user_name,obj.user_key], user_type, user_proj, user_func]

        return user

    def login_set(self,uname):

        obj = user_doc.objects.get(user_name=uname)

        user_id = obj.ID

        obj.type = 'busy' ## set user type state as “busy”

        obj.save()

        return user_id

  

    def logout_set(self,user_id):

        obj = user_doc.objects.get(ID=user_id)

        obj.type = 'free' ## set user type state as “free”

        obj.save()
        return self

  

    def log_chk(self,user_id):

        obj = user_doc.objects.get(ID=user_id)

        user_proj = obj.proj.split(',')

        user_proj = list(map(int, user_proj))

        user_func = obj.auth.split(',')

        user_func = list(map(int, user_func))

        user_auth = [user_proj, user_func]

        return user_auth
 
Models.py:
###########################################

  class user_doc(models.Model):

    ID = models.AutoField(primary_key=True)

    user_name = models.CharField(max_length=30)

    user_key = models.CharField(max_length=30)

    type = models.CharField(max_length=20)  ##'free'-available, else-inusing

    proj = models.CharField(max_length=1000) ##project authority: 101,102

    auth = models.CharField(max_length=100) ##function authority:1,2,3,4,5
 


3、百度地图的引入

在index.html中

<head>

    <meta charset="UTF-8">

    <title>Title</title>

    <script type="text/javascript" src="http://api.map.baidu.com/api?key=&v=1.1&services=true"></script>

    <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

    <meta name="keywords" content="map" />

    <meta name="description" content="map" />

    <style type="text/css">

    html,body{margin:0;padding:0;}

    .iw_poi_title {color:#CC5522;font-size:14px;font-weight:bold;overflow:hidden;padding-right:13px;white-space:nowrap}

    .iw_poi_content {font:12px arial,sans-serif;overflow:visible;padding-top:4px;white-space:-moz-pre-wrap;word-wrap:break-word}

    table .white {color:#ffffff}

    </style>

  </head>
<body bgcolor="#202020">
<div id="mp" style="position:absolute; left:5px; top:45px" class="divcss5">

    <div id="dituContent" style="width:1450px;height:800px;border:#ccc solid 1px;"></div>

  </div>
</body>
<script type="text/javascript">

    //创建和初始化地图函数:

    function initMap(){

        createMap();//创建地图

        setMapEvent();//设置地图事件

        addMapControl();//向地图添加控件

        addMarker();//向地图中添加marker

    }

    //创建地图函数:

    function createMap(){

        var map = new BMap.Map("dituContent");//在百度地图容器中创建一个地图

        var point = new BMap.Point(116.314274,39.925991);//定义一个中心点坐标

        map.centerAndZoom(point,13);//设定地图的中心点和坐标并将地图显示在地图容器中

        window.map = map;//将map变量存储在全局

    }

    //地图事件设置函数:

    function setMapEvent(){

        map.enableDragging();//启用地图拖拽事件,默认启用(可不写)

        map.enableScrollWheelZoom();//启用地图滚轮放大缩小

        map.enableDoubleClickZoom();//启用鼠标双击放大,默认启用(可不写)

        map.enableKeyboard();//启用键盘上下左右键移动地图

    }

    //地图控件添加函数:

    function addMapControl(){

        //向地图中添加缩放控件

   var ctrl_nav = new BMap.NavigationControl({anchor:BMAP_ANCHOR_TOP_LEFT,type:BMAP_NAVIGATION_CONTROL_LARGE});

   map.addControl(ctrl_nav);

        //向地图中添加缩略图控件

   var ctrl_ove = new BMap.OverviewMapControl({anchor:BMAP_ANCHOR_BOTTOM_RIGHT,isOpen:1});

   map.addControl(ctrl_ove);

        //向地图中添加比例尺控件

   var ctrl_sca = new BMap.ScaleControl({anchor:BMAP_ANCHOR_BOTTOM_LEFT});

   map.addControl(ctrl_sca);

    }

    //标注点数组,一个标注点就是一个元素,用{}括起

    var markerArr = [{title:"项目1",content:"蓝筹名座",point:"116.212313|39.926586",isOpen:0,icon:{w:21,h:41,l:0,t:0,x:6,lb:5}}

       ,{title:"项目2",content:"丽贝亚",point:"116.444309|39.93297",isOpen:0,icon:{w:21,h:41,l:0,t:0,x:6,lb:5}}

       ,{title:"项目3",content:"北航",point:"116.353|39.987",isOpen:0,icon:{w:21,h:41,l:0,t:0,x:6,lb:5}}

       ];

    //创建marker

    function addMarker(){

        for(var i=0;i<markerArr.length;i++){

            var json = markerArr[i];

            var p0 = json.point.split("|")[0];

            var p1 = json.point.split("|")[1];

            var point = new BMap.Point(p0,p1);

         var iconImg = createIcon(json.icon);

            var marker = new BMap.Marker(point,{icon:iconImg});

         var iw = createInfoWindow(i);

         var label = new BMap.Label(json.title,{"offset":new BMap.Size(json.icon.lb-json.icon.x+10,-20)});

         marker.setLabel(label);

            map.addOverlay(marker);

            label.setStyle({

                        borderColor:"#808080",

                        color:"#333",

                        cursor:"pointer"

            });

         (function(){

            var index = i;

            var _iw = createInfoWindow(i);

            var _marker = marker;

             //自己的网页跳转,linkin(index)是tht写的,可以根据不同的标注点的序号跳到不同的web页面

            _marker.addEventListener("click",function(){

                this.openInfoWindow(_iw);

                linkin(index);

             });

             //完成

             _iw.addEventListener("open",function(){

                _marker.getLabel().hide();

             })

             _iw.addEventListener("close",function(){

                _marker.getLabel().show();

             })

            label.addEventListener("click",function(){

                _marker.openInfoWindow(_iw);

             })

            if(!!json.isOpen){

               label.hide();

               _marker.openInfoWindow(_iw);

            }

         })()

        }

    }

    //创建InfoWindow

    function createInfoWindow(i){

        var json = markerArr[i];

        var iw = new BMap.InfoWindow("<b class='iw_poi_title' title='" + json.title + "'>" + json.title + "</b><div class='iw_poi_content'>"+json.content+"</div>");

        return iw;

    }

    //创建一个Icon

    function createIcon(json){

        var icon = new BMap.Icon("/static/pics/mk.jpg", new BMap.Size(json.w,json.h),{imageOffset: new BMap.Size(-json.l,-json.t),infoWindowOffset:new BMap.Size(json.lb+5,1),offset:new BMap.Size(json.x,json.h)})

        return icon;

    }

      function linkin(index){

                if (index<1) {

                            window.location.href='/prolist/';

                            } else {

                            window.location.href='/prolist/';

                                    }

    }

    initMap();//创建和初始化地图

  </script>


4、Html页面持续刷新
<head>

    <meta charset="UTF-8">

    <title>Title</title>

    <meta http-equiv="refresh" content="20">

  </head>


5、后台向前端页面传输数据
在html中用{{data1}}    {{data2}}
在view中用:return render(request, 'index.html',{"data1":dt01,"data2":dt02})
 
from django
.shortcuts import render 
def 
main_page(request
):
    
list 
= 
['view', 
'Json', 
'JS']
    
return 
render(request
, 
'index.html', 
{
        
'List': json
.dumps(list),
    
})----js
----var 
List 
= 
{{ 
List|safe }};
 


6、前台向后台传数据
在html中
<form name="fmact" method="post" action="/acount/" >

    <input name="uname" type="text" placeholder="姓名" style="。。。">

    <input name="utel" type="text" placeholder="电话" style="。。。">

    <input name="ucity" type="text" placeholder="城市" style="。。。">

    <input name="uadr" type="text" placeholder="地址" style="。。。">

    <input type="submit" value="提交"  style="。。。">

  </form>
在view.py中
def acount(request):

    username = 0

    usertel = 0

    usercity = 0

    useraddress = 0

    if request.method == "POST":

        username = request.POST.get("uname",None)

        usertel = request.POST.get("utel",None)

        usercity = request.POST.get("ucity",None)

        useraddress = request.POST.get("uadr",None)

        print(username)

        print(usertel)

        print(usercity)

        print(useraddress)

        response = HttpResponseRedirect('/index/')

        return response

    return render(request, 'acount.html')
 


7、html中class的应用
<head>

    <style type="text/css">

    table .white {color:#ffffff}

    </style>

  </head>
<body>
<div>

    <table id="e_in">

        <tr>

            <td align="center" style="width:70px" class="white">本月用电总量:</td>

        </tr>

    </table>

  </div>
</body>


8、Html中echart的应用
<head>

    <script src="/static/js/echarts.js"></script>

  </head>
<body bgcolor="#202020">
<div id="echt5" style="position:absolute; left:1470px; top:500px; width: 420px;height:440px;">

    <script type="text/javascript">

       var myecht5= echarts.init(document.getElementById('echt5'));

       var option5 = {

                      tooltip: {},

                      xAxis: [{

                                data: ["pjt1","pjt2","pjt3","pjt4","pjt5"],

                                axisLabel: {

                                            show: true,

                                            textStyle: {  color: 'white'  }

                                            }

                      }],

                      yAxis: [{

                                axisLabel: {

                                            show: true,

                                            textStyle: {  color: 'white'  }

                                            }

                      }],

                      series: [{

                                name: '输出电流',

                                type: 'bar',

                                itemStyle: {normal: {color: '#a8bcd4'}  },

                                data: {{ crt1 }}

                            }]

            };

       myecht5.setOption(option5);

    </script>

  </div>
</body>


9、Html页面跳转
<td align="center" style="width:40px" class="white"><a href = "/prolist/">{{n_pro}}</a></td>


<td align="center" class="white" style="width:300px" bgcolor="#f0a060"><a onclick=javascript:pro01()>北京丽贝亚大厦</a></td>

  <script>

if({{proqx01}}==1){ function pro01(){ window.location.href="/stn1/"; } }

  </script>
<input id="pv" type="image" title="pv" src="/static/pics/pv.png" style="..." onclick=javascrtpt:pv()>

  <script>

    if({{pvqx}}==1){ function pv(){ window.location.href="http://yun.izenery.com:8080/monitor/"; } }

  </script>

注意相对路径和绝对路径


10、Html中线条闪烁
<div id="lin_eb">

    <hr style="position:absolute; left:1255px; top:150px; height:230px; width:230px; border-radius:50%; border-left:8px dotted #505050; border-bottom:8px dotted #505050; border-top:8px dotted #505050; border-right:8px dotted #505050;"/>

    <hr style="position:absolute; left:1255px; top:150px; height:230px; width:230px; border-radius:50%; border-left:8px dotted orange; border-bottom:8px dotted orange; border-top:8px dotted orange; border-right:8px dotted orange;"/>

    <hr style="position:absolute; left:1215px; top:110px; height:310px; width:310px; border-radius:50%; border-left:10px dotted #505050; border-bottom:5px dotted #505050; border-top:5px dotted #505050; border-right:10px dotted #505050;"/>

    <hr style="position:absolute; left:1215px; top:110px; height:310px; width:310px; border-radius:50%; border-left:10px dotted orange; border-bottom:5px dotted orange; border-top:5px dotted orange; border-right:10px dotted orange;"/>

    <hr style="position:absolute; left:1165px; top:60px; height:410px; width:410px; border-radius:50%; border-left:10px dotted #505050; border-bottom:5px dotted #505050; border-top:5px dotted #505050; border-right:10px dotted #505050;"/>

    <hr style="position:absolute; left:1165px; top:60px; height:410px; width:410px; border-radius:50%; border-left:10px dotted orange; border-bottom:5px dotted orange; border-top:5px dotted orange; border-right:10px dotted orange;"/>

  </div>

  <script>

    function setTime8(){

        var lineb=document.getElementById("lin_eb");

        lineb.appendChild(lineb.firstChild);

     }

    setInterval("setTime8()",100);

  </script>


11、网络爬虫自动登录
from app01 import es_pachong


def es(request):

    if request.method == "GET":

        es_pachong.espc()

        print("denglu")

        response = HttpResponseRedirect('http://cloud.izenery.com:8080/ideer/page/index.do')

        return response

    return render(request, 'es.html')

########################################################################

from selenium import webdriver

  def espc():

    # 实例化出一个Firefox浏览器

    driver = webdriver.Chrome()

    driver.set_page_load_timeout(10)

    driver.set_script_timeout(10)

    # 设置浏览器窗口的位置和大小

    driver.set_window_position(10, 10)

    driver.set_window_size(200, 200)

    # 打开一个页面(合天登录页)

    try:

        driver.get("http://cloud.izenery.com:8080/ideer/")

    except:

        print("加载页面太慢,停止加载,继续下一步操作")

        driver.execute_script("window.stop()")

    # 通过使用选择器选择元素进行模拟输入和点击按钮提交

    driver.find_element_by_id('username').clear()

    driver.find_element_by_id('username').send_keys("15101092397")

    driver.find_element_by_id('pwd').clear()

    driver.find_element_by_id('pwd').send_keys("123456")

    driver.find_element_by_xpath(".//*[@class='col-lg-12']/button").click()


12、测试数据的生成,类的建立
import numpy

  import threading

  import random

  # Create your models here.

  class login():

    user01 = (('kdkj','123456'),(1,1,1,0,0),(1,1,1,1,1,1,1,1,1))

    user02 = (('shzf', 'shzf'), (1, 1, 0, 0, 0), (1, 1, 1, 0, 0, 0, 1, 0, 0))  ###eb\pd\ac\gl\pv\es\tf\dd

    def __str__(self):

        return self.ID

  class data_static():

    num_pro = 4

    num_pd = 2

    num_es = 1

    num_pv = 1

    num_ac = 1

    num_gl = 0

    def e_use(self):

        e_u = random.randint(60, 80)

        return e_u

    def e_rate(self):

        e_r = random.randint(0, 30)

        return e_r

    def alarm(self):

        alm = random.randint(0, 10)

        return alm

    def alm_rate(self):

        a_r = random.randint(-50, 50)

        return a_r

    def g_use(self):

        g_u = random.randint(500, 800)

        return g_u

    def g_rate(self):

        g_r = random.randint(-40, 40)

        return g_r

    def w_use(self):

        w_u = random.randint(1000, 1500)

        return w_u

    def w_rate(self):

        w_r = random.randint(-20, 20)

        return w_r


13、数据库设定

Setting.py中

DATABASES = {

    'default': {

        'ENGINE': 'django.db.backends.mysql',

        'NAME': 'tht4',  ##数据库的名称

        'HOST':'127.0.0.1',  ##数据库主地址

        'PORT':3306,  

        'USER':'root',

        'PASSWORD':'123456',

    }

}

Models.py中:

from django.db import models

  

  # Create your models here.

  class stn01_info(models.Model):

    stn_id = models.IntegerField(primary_key=True)

    stn_name = models.CharField(max_length=30)

    worker = models.CharField(max_length=30)

    stn_x = models.IntegerField()

    stn_y = models.IntegerField()

    trm01_cap = models.IntegerField()

    trm02_cap = models.IntegerField()

    def __str__(self):

        return self.ID


14、数据库记录读取

Models.py中建立表和字段

from django.db import models
class user_info(models.Model):

    ID = models.IntegerField(primary_key=True)

    user_name = models.CharField(max_length=30)

    user_key = models.CharField(max_length=30)
 
注意!不要在最后写:
def __str__(self):

         return self.ID
 

然后通过

python manage.py makemigrations

python manage.py migrate

将表和字段设计同步到mysql数据库中

然后通过mysql——workbench,在表中添加多条记录

在要使用记录数据的python文件中中

from app01.models import user_info
user01 = user_info.objects.get(user_name='kdkj')
 
数据库外键约束的暂时忽略:
问题:在执行python manage.py migrate时,出现:
django.db.utils.OperationalError: (1833, "Cannot change column 'ID': used in a foreign key constraint 'app01_wcu_data_01_dvc_id_id_7ac564ae_fk_app01_wc u_tag_ID' of table 'fyy01.app01_wcu_data_01'")
则在settings文件中添加数据库设置

DATABASES = {

  ‘default’: {

           'OPTIONS': { "init_command": "SET foreign_key_checks = 0;", }
}

}

  在开发完成之后可以把该设置去掉


15、数据库中读出的字符串转换为整形数组
temp = user_info.objects.get(user_name='kdkj')

user01 = temp.qx_pro.split(',') ##先把字符串转换为数组

user01 = list(map(int,user01))  ##再把字符数组转换为整形数组


16、Django打包发布
安装pyinstaller
pip install pyinstaller
制作项目的.spec文件

  进入django项目所在路径,运行
pyi-makespec -D manage.py
   在路径下,生成一个.spec文件
在.spec文件中,注意hiddenimports=["pyexpat"]
pyinstaller manage.spec


17、打包以后图片不能加载

步骤1:在settings.py文件的最后加上以下内容:


STATIC_URL = '/static/'

STATIC_ROOT = os.path.join(os.path.dirname(__file__),'static')

# 设置图片等静态文件的路径

STATICFILES_DIRS = (

('css',os.path.join(STATIC_ROOT,'css').replace('\\','/') ),

('js',os.path.join(STATIC_ROOT,'js').replace('\\','/') ),

('images',os.path.join(STATIC_ROOT,'images').replace('\\','/') ),

('upload',os.path.join(STATIC_ROOT,'upload').replace('\\','/') ),

)


步骤2:在urls.py文件的开头第一行和第二行分别加上以下内容:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns

from django.contrib import staticfiles

在urls.py文件最后加上以下内容:

#设置静态文件路径

urlpatterns += staticfiles_urlpatterns()


步骤3:设置静态文件的目录,很关键

整个文件的目录结构如下

project---project

---app

|

----static

|

-----templates

你的static和templates处于同级目录,然后将你的images,css,js文件夹放在static目录下面

测试:在你模板,也就是html文件中

<p><img src="/static/images/bg_information.png.png" width="980" height="180"></p>

改成自己的图片名称,注意图片前缀:/static/images/ 别写成 static/images/ 这样会无法显示


18、利用pymysql操作数据库
import pymysql
data_db = pymysql.connect(host='localhost',

                          port=3306,

                          user='root',

                          passwd='123456',

                          db='kd')

  # 创建游标

  cursor = data_db.cursor()

  # 查询

  try:

    sql = "select * from app01_data_smp"

    cursor.execute(sql)

    row_num = cursor.rowcount  # 查询一共有多少条数据

    data_store = cursor.fetchall()

    dt_id = data_store[row_num - 1][0]

    print(dt_id)

  except:

    print("error")

  

  for i in range(10):

    dt_id = dt_id + 1

    sql = "INSERT INTO `kd`.`app01_data_smp` (`dt_ID`, `date_ic`, `time_ic`, `dt_dir`, `dt_type`, `dt_value`, `sensor_id`) VALUES (%s,%s,%s,%s,%s,%s,%s)"

    nowtime = datetime.datetime.now()

    date_ic = int("%04d" % nowtime.year + "%02d" % nowtime.month + "%02d" % nowtime.day)

    time_ic = int("%02d" % nowtime.hour + "%02d" % nowtime.minute + "%02d" % nowtime.second)

    dt_dir = 1

    dt_type = 19

    dt_value = random.randint(60, 80)

    sensor_id = 1001010205

    cursor.execute(sql, [dt_id, date_ic, time_ic, dt_dir, dt_type, dt_value, sensor_id])

    time.sleep(0.05)

  

  # 提交,不然无法保存新建或者修改的数据

  data_db.commit()

  

  # 关闭游标

  cursor.close()

  # 关闭连接

  data_db.close()


19、获取系统日期和时间
import datetime
nowtime = datetime.datetime.now()

date_ic = int("%04d" % nowtime.year + "%02d" % nowtime.month + "%02d" % nowtime.day)

time_ic = int("%02d" % nowtime.hour + "%02d" % nowtime.minute + "%02d" % nowtime.second)


20、IIS上通过wfastcgi发布。
1、 申请云服务器,我申请的是腾讯云的windows。
2、 在安全组里添加规则,来源填:0.0.0.0/0;端口填TCP:8000;如此循环,加上TCP:80;TCP:82;TCP:3306
3、 安装wfastcgi。在python.exe所在的目录下,输入pip install wfastcgi。然后cmd重定位/scripts/文件夹下,输入wfastcgi-enable。
4、 然后把wfastcgi.py文件拷贝到项目根目录下,、与manage.py同目录。在wfastcgi.py头部增加:
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "项目中app的名称.settings")
django.setup()
5、 IIS添加网站,IIS的安装方法网上很多教程,此处略去。
6、 右击IIS左侧下拉菜单中的网站,选择添加网站
输入网站名称,配置好网站的物理路径,端口号,确定进入。
7、 在网站主页对应的控制台里,选择处理程序映射
双击进入,然后在右面菜单列表中点击“添加模块映射”
注:
IIS7.0 部署异常 【不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况】解决方法
因为 iis 7 采用了更安全的 web.config 管理机制,默认情况下会锁住配置项不允许更改。
运行命令行 %windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/handlers 。
其中的 handlers 是错误信息中红字显示的节点名称。
如果modules也被锁定,
可以运行%windir%\system32\inetsrv\appcmd unlock config -section:system.webServer/modules
注意:cmd.exe要以管理员身份启动,在c:\windows\system32下找到cmd.exe,
右键管理员启动,输入上面的命令即可。
处理程序映射不能正常打开时,亦是如此处理!
如果出现:处理程序“ExtensionlessUrlHandler-Integrated-4.0”在其模块列表中有一个错误模块“ManagedPipelineHandler”,
则CMD中执行:C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i
可执行文件一栏输入“python程序”和“wfastcgi.py”的位置,位置请记下来,此处“MARK-A”,,注意别忘了中间的“|”符号,名称随意填写,但是请记下来,此处“MARK-B” 

  填完后点开请求限制,把“仅当请求映射至以下内容时才调用处理程序勾掉”
确认添加后会弹出创建FastCGI应用程序对话框,点击确认创建
这样在处理程序映射里就能看到刚添加的FastCGI映射了
然后在项目根目录下会发现多了一个web.config
打开文件
把里面的内容替换成如下代码:
<?xml version="1.0" encoding="UTF-8"?>
    <configuration>
        <system.webServer>
            <handlers>
            <add name="MARK-B" path="*" verb="*" modules="FastCgiModule" scriptProcessor="MARK-A" resourceType="Unspecified" />
                <add name="Python FastCGI" path="*" verb="*" modules="FastCgiModule" scriptProcessor=" MARK-A " resourceType="Unspecified" requireAccess="Script" />
            </handlers>
        </system.webServer>
        <appSettings>
            <add key="WSGI_HANDLER" value="django.core.handlers.wsgi.WSGIHandler()" />
            <add key="PYTHONPATH" value="C:\pj_python\fbtest01" />
            <add key="DJANGO_SETTINGS_MODULE" value="项目中setting所在的app的名称.settings" />
        </appSettings>
    </configuration>
scriptProcessor的值,要改为前文说过的MARK-A。PYTHONPATH的value要改为项目中manager.py文件的所在目录,也就是你项目的根目录。DJANGO_SETTINGS_MODULE的value中的<Django App>要改为你的项目中settings文件所在的APP名称。
然后重启一下你的网站,域名没有错的话,应该就可以访问了,当然这时候静态链接还不行,图片、css还不对。
如果出了Bad Request - Invalid Hostname 400错误,则是防火墙没设置好入站规则
 很多人在配置好IIS服务器之后,打开自己的网站返回的确是Bad Request错误。导致这一错误的主要原因是域名已经解析,但是无法找到域名对应的主机。
    在设置网站标识时,通常将服务器IP设置为“全部未分配”(如下图所示),这时即可保证解析到服务器绑定的任何IP都可以访问到WEB服务。这合适在多网卡服务器时配置,一般都是一个IP,或者即使是多网卡,也需要指定到确切的IP,方便管理和后期维护。
    主机名推荐设置为空,如果主机名设置格式错误同意易导致访问不到想要的网站。
    此外,防火墙也很容易拦截外部设备访问我们服务器的请求,因此推荐在发布网站前,将自己的windows防火墙关闭。防火墙的入口也可以从控制面板中找到。
    如果觉得关闭防火墙太过不安全,可以使用下面这种方法:在防火墙中选中高级设置;
    选中左侧入站规则,然后点击右侧的新建规则按钮;
    在新建规则界面中,选择创建端口类型的规则,并点击下一步;
     接下来可以选择特定的端口号,选择的端口号一般都要大于80,80号端口为浏览器默认的访问端口。
     接下来选择连接符合条件时的操作,选择允许连接;
     应用规则按照下图勾选,一般这些都是电脑默认的选项;
     最后填写一下名称和描述即可完成入站规则。
     创建该入站规则的作用是让防火墙有选择地过滤掉来自外部的访问,并同时让我们本地的网站能够被访问到。但是入站规则起作用的前提是防火墙得处于开启状态,如果防火墙没开,服务器也没安装其他防护软件,通常不会出现因为拦截而访问不了站点的问题。
 
如果出了HTTP500.0错误,,fastcgi异常退出,,则到IIS的总控制台
双击点开Fastcgi设置
找到本项目所添加的cgi路径,双击点进去
找到环境变量—集合,右侧小方框,点进去
手动添加三个变量
WSGI_HANDLER
PYTHONPATH
DJANGO_SETTINGS_MODULE
值就在web.config里面。。添加进去,,然后在应用程序池回收一下,,然后网站重启就行了。


21、Django中程序中图片资源的路径问题(static文件夹的放置)

步骤1:在settings.py文件的最后加上以下内容:

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(os.path.dirname(__file__),'static')


# 设置图片等静态文件的路径

STATICFILES_DIRS = (
('css',os.path.join(STATIC_ROOT,'css').replace('\\','/') ),
('js',os.path.join(STATIC_ROOT,'js').replace('\\','/') ),
('pics',os.path.join(STATIC_ROOT,'pics').replace('\\','/') ),
('upload',os.path.join(STATIC_ROOT,'upload').replace('\\','/') ),
)


步骤2:在urls.py文件的开头第一行和第二行分别加上以下内容:

from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.contrib import staticfiles


在urls.py文件最后加上以下内容:

#设置静态文件路径
urlpatterns += staticfiles_urlpatterns()


步骤3:设置静态文件的目录,很关键


整个文件的目录结构如下

static 文件夹在app文件夹下面。(当然这对后面的大型应用来说不好,但是做为初学者已经够用了)


你的static和templates处于同级目录,然后将你的images,css,js文件夹放在static目录下面


测试:在你模板,也就是html文件中


改成自己的图片名称,注意图片前缀:/static/images/ 别写成 static/images/ 这样会无法显示.

 


通过传统的”?”传递参数

例如,http://127.0.0.1:8000/plist/?p1=china&p2=2012,url中‘?’之后表示传递的参数,这里传递了p1和p2两个参数。


通过这样的方式传递参数,就不会出现因为正则匹配错误而导致的问题了。在Django中,此类参数的解析是通过request.GET.get方法获取的。


配置URL及其视图如下:


(r'^plist/#39;, helloParams1)


def helloParams(request):

p1 = request.GET.get('p1')

p2 = request.GET.get('p2')

return HttpResponse("p1 = " + p1 + "; p2 = " + p2)

输出结果为”p1 = china; p2 = 2012″


记录两种方法,实现只使用django(不用django-rest-framework等框架),编写返回json数据的接口。

方法1:

views.py:

def getAllUser(request):
    # 
手动编写
api
的方法,返回的
response
为
json
格式
    queryset = models.Users.objects.all()
    resList = []
    for i in queryset:
        resList += [{
            'userType': i.userType,
            'userId': i.userId,
        }]
    return JsonResponse(resList, safe=False)

方法2:

views.py:

def getAllUser(request):
    # 
手动编写
api
的方法,返回的
response
为
json
格式
    queryset = models.Users.objects.all()
    resList = []
    for i in queryset:
        resList += [{
            'userType': i.userType,
            'userId': i.userId,
        }]
    response = json.dumps(resList) 
    return HttpResponse(response, content_type='application/json')

也就是说,方法1中的JsonReponse(...)等价于方法2中的最后两句


22、使用javascript实现图片的交替显示
<script language=javascript>

var numAD=0;

var imgAD = new Array();

imgAD[0] = "/static/pics/pg1_1.jpg";

imgAD[1] = "/static/pics/pg1_2.jpg";

imgAD[2] = "/static/pics/pg1_3.jpg";

function setTransition(){

  if(document.all){

    u.filters.revealTrans.Transition=Math.floor(Math.random()*23);

    u.filters.revealTrans.apply();

  }

}

function playTransition(){

  if(document.all){

    u.filters.revealTrans.play();

  }

}

function nextAD(){

  setTransition();

  document.u.src=imgAD[numAD];

  playTransition();

  if(numAD >= imgAD.length-1){

    numAD=0;

  }else{

    numAD++;

  }

  setTimeout("nextAD()",1000);

}

    </script>

    <img src="/static/pics/pg1_1.jpg"  width="200" height="100"  name="u" id="u" style="width:100%; height:auto; FILTER: revealTrans(duration=2,transition=20)"  >

    <script language="JavaScript">nextAD()</script>


23、使用ajax实现前后端数据传输

前端向后端传数

Html部分:

<td align="center" style="width:50%"><a id="lk-wc" onclick=javascript:fnwc() title="0"><img title="Water chiller" src="/static/pics/tool-wc.png"/></a></td>

    <script>

    function fnwc(){

        var tgt=document.getElementById("lk-wc");

        var n=tgt.title;

        n++;

        tgt.title=n;

        var logo= "wc"

        var rst=logo+n;

        document.getElementById(rst).style.display="block"

        var send_data = {"md_wc":rst,};

        $.ajax({

            type: "POST",

            url: "../plate/",

            data: send_data,

            csrfmiddlewaretoken:'{{ csrf_token }}'

        });

      }

    </script>

Python的view部分:

from django.views.decorators.csrf import csrf_exempt
 
@csrf_exempt

  def plate(request):

    wc_rst = 0

    es_rst = 0

    if request.method == "POST":

        name_wc = request.POST.get('md_wc')

        name_es = request.POST.get('md_es')

        print("wc name as:", name_wc)

        print("es name as:", name_es)

        wc_rst = 1

        es_rst = 1

    return render(request, 'plate.html',{"wcr":wc_rst, "esr":es_rst})


三 JavaScript Ajax 动态刷新页面

这个标题的意思是:网页前台使用Ajax发送请求,后台处理数据后返回数据给前台,前台不刷新网页动态加载数据

Django 代码:

from django.http import HttpResponse,JsonResponse
def scene_update_view(request):
    if request.method == "POST":
            name = request.POST.get('name')
            status = 0
            result = "Error!"
            response = JsonResponse({"status": status,"result": result})

return response

JS 代码:

        function getSceneId(scece_name, td) {
            var send_data = {
                "name": scece_name,
            };
 
            $.ajax({
                type: "POST",
                    url: "../project2/",
                    data: send_data,                
success: function (data) {
                            ##data = JSON.parse(data);##这句没用
alert(data["status"]);
                     }
                    error: function() {  }
            });
        } 

JS 发送ajax请求,后台处理请求并返回status, result
在 success: 后面定义回调函数处理返回的数据,需要使用 JSON.parse(data)


24、生成pyc文件

在pycharm的terminal界面里,在manage.py文件路径下,执行:

python -m compileall <dir>

1.先将文件编译成pyc文件:但是文件都存在各个文件夹的__pycache__中

2.将__pycache__中的pyc文件拷贝到原来py存在的位置:python pyc_create copy 文件的根路径;这样就将编译的文件存在原来py文件的位置了

3.将原来的py文件删掉就可以了:python pyc_create remove 文件根路径

4.将文件的名字进行更改,我这里使用的是pyhon 3.6版本的,所以文件的名字变成了*.cpython-36.pyc,要将其中的cpython-36去掉,不然不能正常运行,因为文件的名字默认最后一个后缀是扩展名,其他的为文件名字

执行完毕,就可以使用了


25、Python调用API接口,并且解析JSON数据

测试用的API接口:

https://www.dmoe.wang/md0005m?uid=tht&ukey=123456&deviceid=8430&PWe=100&Rou=1&Fsp=35&Far=2&Pin=11&Pout=9

返回的JSON数据列表:

[{"error": "None", "powerout": 137.20000000000002, "nengxiao": 1.372}]

可见返回的JSON数据是一个字典数组


import urllib

  import urllib.request

  import json

  import ssl

ssl._create_default_https_context = ssl._create_unverified_context ##屏蔽SSL验证,不然会报错

  

  Whtml = urllib.request.urlopen('https://www.dmoe.wang/md0005m?uid=tht&ukey=123456&deviceid=8430&PWe=100&Rou=1&Fsp=35&Far=2&Pin=11&Pout=9')

Wcont = Whtml.read()

  print("shuju:", Wcont) ##显示所有的JSON返回数据

Wjson = json.loads(Wcont)

  print("powerout:", Wjson[0]["powerout"])  ##提取出第一个字典中的“powerout”数据项的数值


26、Python通过post向外部URL请求数据
post_url = "http://110.53.163.220:10103/data/device/searchLoad-emes.jspx"

  post_data = {

    "page": "1",

    "s$date$ge$date": "2020-07-18 10:22:09",

    "s$date$le$date": "2020-08-20 10:22:09",

    "meter": "4",

    "authCode": "ea970057ff52de917e225e823c2adadfa6ad20760fad782cadd6c9d5a7782276",

}

  

resp = requests.post(url=post_url, data=post_data)

  

content = resp.json()

  print(content)


27、Python定时任务让数据接口保持运行
from apscheduler.scheduler import Scheduler
##定时任务

  sched = Scheduler()  #实例化,固定格式

  @sched.interval_schedule(seconds=5)

  def mytask1():

    meter_1d_data_get()

  

  @sched.interval_schedule(seconds=10)

  def mytask2():

    meter_15m_data_get()

  

sched.start()  # 启动该脚本


28、利用for循环遍历数组的元素
abc = [11,22,33,44]
for index, element in enumerate(abc):
index = 1,2,3,4##

    element = 11,22,33,44##


29、django models用related_name实现一个模型中多个外键指向同一个属性

related_name相当于我们使用related代替了在通过一个对象查询出多个对象集合时,使用表名_set来获取

class LVBC_tag(models.Model):  ## Low voltage bus coupler

    ID = models.AutoField(primary_key=True)

    LVbus1_id = models.ForeignKey(to="LVbus_tag", to_field="ID", on_delete=models.CASCADE, related_name='LVbus1_id')

    LVbus2_id = models.ForeignKey(to="LVbus_tag", to_field="ID", on_delete=models.CASCADE, related_name='LVbus2_id')

    LVBC_serial_num = models.IntegerField(50)

    LVBC_pdct_time = models.IntegerField(20)


30、pymysql.err.InternalError: (1091, "Can't DROP 'Tmark'; check that column/key exists")
在DMOE中,migrations文件夹中打开最新的migration文件
然后把这一段注释掉:

    migrations.RemoveField(

         model_name='md0010',

         name='Tmark',

     ),

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码