使用Django处理excel

2019-10-31 张宇童 Python

感觉大部分没有使用到Django其实并不是标题所说的使用Django了。大部分还要是python原生内容为主

首先需要安装xlrd这个扩展包

pip3 install xlrd

然后在Django中接收到文件

import xlrd
fs = reuqest.FILES.get('file_name');
fd = xlrd.open_workbook(filename=None, file_contents=fs.read())
table = fd.sheets()[0]
rows = table.nrows
for i in range(1, rows):
    ...


标签: python 扩展 excel 处理文件

评论(0) 浏览(570)

django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.2

2019-10-28 张宇童 Python

使用python3.7+django2.2+pymysql时遇到这个错误,

django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.2

别急,这主要是django2.2内部的一个版本限制在作怪处理方案

1.修复源码
按照文中配置,报错django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.
原因:django2.2和pymysql版本不匹配。mysqldb不支持python3.
解决方案:
1、raise ImproperlyConfigured(‘mysqlclient 1.3.13 or newer is required; you have %s.’ % Database.version)
  django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.  
解决办法:
C:\Python37\Lib\site-packages\django\db\backends\mysql(python安装目录)打开base.py,注释掉以下内容:        
if version < (1, 3, 13):           raise ImproperlyConfigured(‘mysqlclient 1.3.13 or newer is required; you have %s.’ % Database.version)   
2、File “C:\Python37\lib\site-packages\django\db\backends\mysql\operations.py”, line 146, in last_executed_query   
query = query.decode(errors=‘replace’)   
AttributeError: ‘str’ object has no attribute ‘decode’   
解决办法:
打开此文件把146行的decode修改为encode

屏幕快照 2019-10-28 下午12.24.42.png

注释后即可

屏幕快照 2019-10-28 下午12.26.18.png

ps.django2.2不支持pyMySQL,但2.2是LTS,有想过试试mysqldb,但是MySQLDB又不支持python3。。。。的确让人头大。


标签: python 报错

评论(0) 浏览(1030)

AttributeError: 'str' object has no attribute 'decode'

2019-10-28 张宇童 Python

python3下列代码会报上边的错

print("Response:", resp.text.decode('unicode_escape'))
解决办法:
print("Response:", resp.text.encode('utf-8').decode('unicode_escape'))
中间加上.encode('utf-8')即可

标签: python 学习笔记

评论(0) 浏览(2742)

React生命周期函数

2019-10-25 张宇童 学习日志

首先贴一张图片,直观深刻的理解一下屏幕快照 2019-10-25 下午9.48.18.png


组件挂载前执行

 1、componentWillMount


组件挂载后执行

2、componentDidMount


组件更新之前执行

3、shouldComponentUpdate


组件被更新之前执行但在shouldComponentUpdate之后执行,如果shouldComponentUpdate返回true执行 返回false不执行

4、componentWillUpdate


组件更新完成之后执行

5、componentDidUpdate


存在于自组件中,要从父组件接受参数,第一次存在于父组件中不会执行,父组件执行render会触发componentWillReceiveProps函数

6、compoentWillReceiveProps


当一个组件将被销毁之前执行

7、componentWillMount

标签: react 生命周期函数

评论(0) 浏览(776)

Django中的SESSION操作

2019-10-25 张宇童 Python

# 获取、设置、删除Session中数据
request.session['k1']
request.session.get('k1',None)
request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在则不设置
del request.session['k1']


# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()

# 会话session的key
request.session.session_key

# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()

# 检查会话session的key在数据库中是否存在
request.session.exists("session_key")

# 删除当前会话的所有Session数据
request.session.delete()
  
# 删除当前的会话数据并删除会话的Cookie。  推荐使用****
request.session.flush() 
    这用于确保前面的会话数据不可以再次被用户的浏览器访问
    例如,django.contrib.auth.logout() 函数中就会调用它。

# 设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
    * 如果value是个整数,session会在些秒数后失效。
    * 如果value是个datatime或timedelta,session就会在这个时间后失效。
    * 如果value是0,用户关闭浏览器session就会失效。
    * 如果value是None,session会依赖全局session失效策略。

标签: python Django

评论(0) 浏览(540)

http请求参数之Query String Parameters、Form Data、Request Payload

2019-10-24 张宇童 学习日志

在与server端进行数据传递时,通常会用到GET、POST方法进行参数提交,而参数提交的方式,通常取决于server端对数据的接收方式。
Query String Parameters
当发起一次GET请求时,参数会以url string的形式进行传递。即?后的字符串则为其请求参数,并以&amp;作为分隔符。

如下http请求报文头:


// General

Request URL: http://foo.com?x=1&amp;y=2 Request Method: GET 
// Query String Parameters
x=1&amp;y=2


Form Data

当发起一次POST请求时,若未指定content-type,则默认content-type为application/x-www-form-urlencoded。即参数会以Form Data的形式进行传递,不会显式出现在请求url中。

如下http请求报头:
// General
Request URL: http://foo.com Request Method: POST 
// Request Headers
content-type: application/x-www-form-urlencoded; charset=UTF-8 
// Form Data
x=1&amp;y=2 
Request Payload
当发起一次POST请求时,若content-type为application/json,则参数会以Request Payload的形式进行传递(显然的,数据格式为JSON),不会显式出现在请求url中。
如下http请求报头:
// General
Request URL: http://foo.com Request Method: POST 
// Request Headers
content-type: application/json; charset=UTF-8 
// Request Payload
x=1&amp;y=2 
如果希望通过Form Data的方式来传递数据,则可以通过原生方法formData()来进行数据组装,且content-type需要设置为multipart/form-data。
如下http请求报头:
// General
Request URL: http://foo.com Request Method: POST 
// Request Headers
content-type: multipart/form-data; charset=UTF-8 
// Request Payload
------WebKitFormBoundaryAIpmgzV8Ohi99ImM
Content-Disposition: form-data; name=“x” 
------WebKitFormBoundaryAIpmgzV8Ohi99ImM
Content-Disposition: form-data; name=“y” 
------WebKitFormBoundaryAIpmgzV8Ohi99ImM–
其中,WebKitFormBoundaryAIpmgzV8Ohi99ImM为浏览器随机生成的boundary,作为分隔参数,作用等同于&amp;。
application/x-www-form-urlencoded 和 multipart/form-data
The content type "application/x-www-form-urlencoded" is inefficient for sending large quantities of binary data or text containing non-ASCII characters. The content type "multipart/form-data" should be used for submitting forms that contain files, non-ASCII data, and binary data.
multipart/form-data的优势还伴随一些兼容性问题,详细请参考文章结束的参考文献。

标签: javascript request ajax

评论(0) 浏览(820)

Echarts使用渐变色的方法

2019-10-24 张宇童 学习日志

我使用的是echarts 4.2版本

在管网的文档中可查看其配置项,以柱状图为例:

首先在series中找type:'line'

1245775-20181115103736671-1818801776.png

然后找到areaStyle

1245775-20181115103822149-970962608.png

在color中有方法能生成渐变色:

// 线性渐变,前四个参数分别是 x0, y0, x2, y2, 范围从 0 - 1,相当于在图形包围盒中的百分比,如果 globalCoord 为 `true`,则该四个值是绝对的像素位置
color: {
    type: 'linear',
    x: 0,
    y: 0,
    x2: 0,
    y2: 1,
    colorStops: [{
        offset: 0, color: 'red' // 0% 处的颜色
    }, {
        offset: 1, color: 'blue' // 100% 处的颜色
    }],
    globalCoord: false // 缺省为 false
}
// 径向渐变,前三个参数分别是圆心 x, y 和半径,取值同线性渐变
color: {
    type: 'radial',
    x: 0.5,
    y: 0.5,
    r: 0.5,
    colorStops: [{
        offset: 0, color: 'red' // 0% 处的颜色
    }, {
        offset: 1, color: 'blue' // 100% 处的颜色
    }],
    globalCoord: false // 缺省为 false
}
// 纹理填充
color: {
    image: imageDom, // 支持为 HTMLImageElement, HTMLCanvasElement,不支持路径字符串
    repeat: 'repeat' // 是否平铺, 可以是 'repeat-x', 'repeat-y', 'no-repeat'
}

第二种方法:使用echarts内置的渐变色生成器echarts.graphic.LinearGradient

{
    type: 'bar',
    itemStyle: {
        normal: {
            color: new echarts.graphic.LinearGradient(
                0, 0, 0, 1,       //4个参数用于配置渐变色的起止位置, 这4个参数依次对应右/下/左/上四个方位. 而0 0 0 1则代表渐变色从正上方开始
                [
                    {offset: 0, color: '#000'},
                    {offset: 0.5, color: '#888'},
                    {offset: 1, color: '#ddd'}
                ]                //数组, 用于配置颜色的渐变过程. 每一项为一个对象, 包含offsetcolor两个参数. offset的范围是0 ~ 1, 用于表示位置
            )
        }
    }
}

效果:

1245775-20181115104603474-1541501906.png

Measure
Measure

标签: echarts 颜色 渐变色 配置

评论(0) 浏览(2522)

exceptions: django2.2/ mysql ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3

2019-10-20 张宇童 Python

在centos部署python应用后访问页面,显示如下异常信息

报错环境 python=3.6,django=2.2
……
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.
解决方法:

Django连接MySQL时默认使用MySQLdb驱动,但MySQLdb不支持Python3,因此这里将MySQL驱动设置为pymysql,使用 pip install pymysql 进行安装,然后在工程文件__init__.py添加以下代码即可。

# 安装pymysql
pip install pymysql
#__init__.py
import pymysql
pymysql.install_as_MySQLdb()
第一种:
django降到2.1.4版本就OK了

第二种(仍使用django 2.2版本):
#找到Python环境下 django包,并进入到backends下的mysql文件夹
cd /opt/anaconda3/envs/envAGC_Mini/lib/python3.6/site-packages/django/db/backends/mysql
#文件列表如下
1320942-20190709151951155-349243023.png


# 找到base.py文件,注释掉 base.py 中如下部分(35/36行)
if version < (1, 3, 3):
     raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)

此时仍会会报错,报错信息如下:

AttributeError: ‘str’ object has no attribute ‘decode’

#找到operations.py文件(46行,版本不同行数不同哈~自个儿find一下),将decode改为encode
#linux vim 查找快捷键:?decode
if query is not None:
    query = query.decode(errors='replace')
return query
#改为
if query is not None:
    query = query.encode(errors='replace')
return query

标签: Django python3

评论(0) 浏览(2130)

Django自带的加密算法

2019-10-20 张宇童 Python

Django 内置的User类提供了用户密码的存储、验证、修改等功能,可以很方便你的给用户提供密码服务。

默认的Ddjango使用pbkdf2_sha256方式来存储和管理用的密码,当然是可以自定义的。

Django 通过PASSWORD_HASHERS 设置选择要使用的算法。下面有一个列表,列出了Django 支持的哈希算法类。列表的第一个元素 (即settings.PASSWORD_HASHERS[0]) 会用于储存密码, 所有其它元素都是用于验证的哈希值,它们可以用于检查现有的密码。意思是如果你打算使用不同的算法,你需要修改PASSWORD_HASHERS,来将你最喜欢的算法在列表中放在首位。

一个settings中的Password_hashers看起来是这样的:

PASSWORD_HASHERS = (

    'django.contrib.auth.hashers.PBKDF2PasswordHasher',
    'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
    'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
    'django.contrib.auth.hashers.BCryptPasswordHasher',
    'django.contrib.auth.hashers.SHA1PasswordHasher',
    'django.contrib.auth.hashers.MD5PasswordHasher',
    'django.contrib.auth.hashers.CryptPasswordHasher',
)

具体在Django中的用户密码生成、验证的过程是怎么样的,可以通过django.contrib.auth.hashers模块中的几个函数大体了解一下。通过对两个函数的了解,完全可以脱离内置的User, 实现自定义的用户表中使用django内置的密码机制。

首先导入

from django.contrib.auth.hashers import make_password, check_password

通过函数名即可发现,主要有两个函数,分别是创建密码和验证

用法

ps = "123456"

dj_ps = make_password(ps, None, 'pbkdf2_sha256')   #创建django密码, 第二个参数为None是每次产生的密码都不用,第三个参数为算法, 后面两个参数可以忽略

ps_bool = check_password(ps, dj_ps) # check_password 返回值为一个Bool类型,验证密码的正确与否

标签: python Django

评论(0) 浏览(635)

ant design pro 中与服务器的交互

2019-10-20 张宇童 学习日志

第一步:首先要设置好代理

屏幕快照 2019-10-20 下午1.42.11.png

第二步:编写接口

屏幕快照 2019-10-20 下午1.43.34.png

第三步:编写effect里面的方法

20190217142242567.png

import { testApi, userApi } from '@/services/api';//testApi就是2步骤里的请求名称

export default {
    namespace: 'testM',//要唯一

    state: {
        list: [],//后台返回的数据存储在该list中,名字想怎么起怎么起
        result: {},//这个是我为了存储后台返回来的json
    },

    effects: {
        * listAPP({ payload }, { call, put }) {//这个是界面调取接口的名称
            const response = yield call(testApi, payload);//这个testApi就是刚才引入的
            yield put({
                type: 'queryList',//通过调用这个把返回数据传给list,result
                payload: response,
            });
        },
        * dealWith({ payload }, { call, put }) {
            const response = yield call(userApi, payload);
            yield put({
                type: 'deal',
                payload: response,
            });
        },
        // 清除
        * clear(_, { put }) {
            yield put({
                type: 'clean',
            });
        },
    },

    reducers: {
        queryList(state, action) {
            return {
                ...state,
                list: action.payload,//啦啦啦,这就拿到数据啦
            };
        },
        deal(state, action) {
            return {
                ...state,
                result: action.payload,
            };
        },
        clean(state) {
            return {
                result: {},
            };
        },
    }
};

屏幕快照 2019-10-20 下午1.52.02.png


标签: javascript ant antdesignpro

评论(0) 浏览(995)

Powered by emlog