0

私は自分のdjangoプロジェクトでSMSを送信しようとしています.これは私のSMS関数です.

mit2sms.py

import urllib
import urllib2



def sendsms(phonenumber,textcontent):
    textcontent=textcontent.decode('utf8').encode('big5') #10
    #textcontent=textcontent.encode('big5')  #9
    url = "https://urls?username=myname&password=mypassword&dstaddr="+phonenumber+"&smbody="+textcontent
    req = urllib2.Request(url)
    response = urllib2.urlopen(req)

Pythonシェルで中国語と英語のSMSを送信できますが、それをdjangoプロジェクトにインポートすると、

'ascii' codec can't decode byte 0xb7 in position 0: ordinal not in range(128)

エラー

私のジャンゴ

ビュー.py

#-*- coding: utf-8 -*-
....
from mit2sms import *   # I import the sms function here
....

def register(request):
    ....
    tel = request.POST['tel']
    textcontent = "會員申請通過"
    sendsms(tel,textcontent)
    ....

views.py と mit2sms.py は同じディレクトリにあります

しかし、登録した後、エラーが発生しました

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/register/

Django Version: 1.9.7
Python Version: 2.7.11
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'member']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/Users/korekyourin/books/stayreal/sandbox/member_register/venv/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  149.                     response = self.process_exception_by_middleware(e, request)

File "/Users/korekyourin/books/stayreal/sandbox/member_register/venv/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  147.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/Users/korekyourin/books/stayreal/sandbox/member_register/member_register/member/views.py" in register
  57.     sendsms(tel,textcontent)

File "/Users/korekyourin/books/stayreal/sandbox/member_register/member_register/member/mit2sms.py" in sendsms
  10.     url = "https://urls?username=myname&password=mypassword&dstaddr="+phonenumber+"&smbody="+textcontent

Exception Type: UnicodeDecodeError at /register/
Exception Value: 'ascii' codec can't decode byte 0xb7 in position 0: ordinal not in range(128)
4

2 に答える 2

1

この行を修正してみてください:

textcontent = "會員申請通過"` 

に:

textcontent = u"會員申請通過".encode('utf-8')
于 2016-06-20T14:22:20.893 に答える
1

UnicodeDecodeError UnicodeDecodeError: 'ascii' codec can't decodestr を暗黙的に Unicode に変換するときに発生する傾向があります。

これは、次の条件下で発生する可能性があります。

unicode('€')                       # explicit conversion without encoding
u"The currency is: {}".format('€') # new style format string into Unicode string - Python will try to convert value string to Unicode first
u'The currency is: %s' % '€'       # old style format string into Unicode string - Python will try to convert value string to Unicode first
u'The currency is: ' + '€'         # append string to Unicode - Python will try to convert string to Unicode first

後者はおそらくあなたが打っているものです-strをUnicodeに追加します。Python は最初に str を Unicode に変換しようとしますが、「ascii」コーデック (Python 2.x) のみを使用するため、ASCII 以外のコンテンツでは失敗します。

すぐにはわかりませんが、以下から Unicode オブジェクトを取得している可能性が非常に高いです。

tel = request.POST['tel']

tel/ phonenumber(Unicode オブジェクト) をtextcontent(big5 でエンコードされた str) に追加すると、 UnicodeDecodeError.

答えは、暗黙の変換を削除し、不要なデコード/エンコードを削除することです。

変化する:

textcontent = u"會員申請通過" # Note the 'u`. textcontent is now a Unicode

次のように変更sendsms()します。

def sendsms(phonenumber,textcontent):
    url = u"https://urls?username=myname&password=mypassword&dstaddr="+phonenumber+"&smbody="+textcontent
    # now a unicode also
    # better written using String.format(): 
    # url = u"https://urls?username=myname&password=mypassword&dstaddr={phonenumber}&smbody={textcontent}".format(phonenumber=phonenumber, textcontent=textcontent)
    req = urllib2.Request(url.encode('big5')) # encode only when absolutely necessary
    response = urllib2.urlopen(req)
于 2016-06-20T15:03:01.233 に答える