有趣生活

当前位置:首页>科技>python和django连接的接口从安装包到云平台

python和django连接的接口从安装包到云平台

发布时间:2026-07-25阅读(1)

导读#python##Django#,接下来我们就来聊聊关于python和django连接的接口?以下内容大家不妨参考一二希望能帮到您!python和dja....

#python##Django#,接下来我们就来聊聊关于python和django连接的接口?以下内容大家不妨参考一二希望能帮到您!

python和django连接的接口(从安装包到云平台)

python和django连接的接口

#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配置

加入urlfrom django.urls import path,includepath(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 cant 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" > <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" >本月用电总量:</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" ><a href = "/prolist/">{{n_pro}}</a></td>

<td align="center" 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("d" % nowtime.year "d" % nowtime.month "d" % nowtime.day) time_ic = int("d" % nowtime.hour "d" % nowtime.minute "d" % 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("d" % nowtime.year "d" % nowtime.month "d" % nowtime.day)time_ic = int("d" % nowtime.hour "d" % nowtime.minute "d" % 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_urlpatternsfrom 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/$, 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 sslssl._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, "Cant DROP Tmark; check that column/key exists")

在DMOE中,migrations文件夹中打开最新的migration文件

然后把这一段注释掉: migrations.RemoveField( model_name=md0010, name=Tmark, ),

TAGS标签:  python  django  连接  接口  安装  python和dja

Copyright © 2024 有趣生活 All Rights Reserve吉ICP备19000289号-5 TXT地图HTML地图XML地图