2016-12-06 7 views
0

Я хочу, чтобы в моем коде отображалось пользовательское сообщение об ошибке, которое зависит от типа ошибки, с которой он сталкивается.Отображение настраиваемого сообщения исключения на основе ошибки

from .forms import NameForm, IdForm 
from django.shortcuts import render 
from django.http import HttpResponse, HttpResponseRedirect 
from django.contrib import messages 
from client_storage import insert 
import mysql.connector.errors 
from mysql.connector.errors import Error 
import MySQLdb 


def sign_in(request): 
     #we need to handle all the data that was just typed, we'll add a condition for that 
     if request.method == "POST": 
      #here will construct the form with the POST data 
      form = NameForm(request.POST) 
      #the next part is to check that the information submitted is valid 
      if form.is_valid(): 
       post = form.save() 
       post.save() 
       return HttpResponse(post.question_text) 
      else: 
       return HttpResponse("Form is invalid") 
     else: 
      form = NameForm() 
     return render(request, 'checkin/base.html', {'form': form}) 

    #this view will be the sign-up view, where new clients will be given new ID numbers for training 

def sign_up(request): 

    if request.method == "POST": 
     form = IdForm(request.POST) 
     if form.is_valid(): 
      post = form.save() 
      post.save() 
      ID = post.id_text 
      #we'll call an external function that checks membership of the users input in the database 
      # query is the first element of the tuple that is returned from insert() 
      query = insert(post.id_text) 
      if query == 1062: 
       messages.add_message(request, messages.INFO, 'Already taken ') 
       return HttpResponseRedirect('sign_up') 
      if query == 1054: 
       messages.add_message(request, messages.INFO, 'Invalid input') 
       return HttpResponseRedirect('sign_up') 
      else: 
       messages.add_message(request, messages.INFO, 'Thank you for signing up!') 
       return HttpResponseRedirect('sign_up') 

      # if the user enters a number that is already in use raise an 'duplicate' error 
      # Capture the exception here 
     else: 
      return HttpResponse('That text is invalid') 
    else: 
     form = IdForm() 
    return render(request, 'checkin/base.html', {'form': form}) 

For the `except` block I'm trying to figure out how to display either "Already taken" or "Invalid input" depending on the error code. However only "Already taken" ever appears. I feel like the problem is that the exception is being thrown before it even gets to the `if` clauses? 

Я использую другой файл для INSERT процесса:

import MySQLdb 
import mysql.connector 
from mysql.connector import errorcode 
from django.contrib import messages 

#Use a function to insert new information into the database 

def insert(info): 
    #open a connection 
    db = MySQLdb.connect('localhost','root','password', 'CLIENTS') 
    #prepare a cursor 
    cursor = db.cursor() 
    #prepare SQL query 
    sql = "INSERT INTO clients(ID) VALUES (%s)" % info 

    try: 
     #execute the command 
     cursor.execute(sql) 
     #commit changes to the database 
     print 'success' 
     db.commit() 
    except MySQLdb.Error as e: 
     #return the first element in the tuple that contains the error message, which will be the errorcode 
     if e[0] == 1062: 
      return e[0] 
     if e[0] == 1054: 
      return e[0] 

    #disconnect from server 
    db.close() 

EDIT Проблема, кажется, в том, что я использовал mysql.connector.error вместо MySQLdb.Error .The mysql сайт, кажется, только для использования бывший. И не так много официальной документации по последнему, кажется, но, к счастью, я нашел this site. Я изменил код, так что вид sign_in получил бы информацию returned от внешнего insert fuction, а затем действовать соответствующим образом.

+2

На [этой странице Документов] (https://dev.mysql.com /doc/connector-python/en/connector-python-api-errors-error.html), третий пример вниз показывает, как использовать условное выражение для номера ошибки исключения. В вашей попытке вы никогда не совершаете * ошибку * (или никогда не привязываетесь ни к чему), поэтому вы не можете сравнивать ни с чем. '' 'bool (Ошибка (errno = 1062))' '' вероятно оценивает '' 'True''', поэтому он всегда * работает *. – wwii

+2

https://docs.python.org/3/tutorial/errors.html#handling-exceptions, – wwii

+1

Замечания @wwii верны. Вы можете отредактировать свой блок 'try .. except' и поймать правильные исключения, а затем вернуть желаемый вывод строки/типа. –

ответ

1

Как то, что @wwii сказал в комментариях, вам нужно отредактировать свой блок try ... except, чтобы поймать исключение. См. Эту страницу от documentations.

Кроме того, в вашем фактическом коде Error(errno=1062) всегда возвращает строку, отличную от нуля, которая подтверждает ваш оператор if. И вот почему вы всегда получали сообщение Already Taken.

Для того, чтобы справиться с этой проблемой, вы должны изменить свой код во что-то вроде этого примера:

# What you need to import 
import mysql.connector 
from mysql.connector import errorcode 

try: 
    insert(post.id_text) 
    messages.add_message(request, messages.INFO, 'Thank you for signing up ') 
    return HttpResponseRedirect('sign_in') 

# Catch the error exception 
except mysql.connector.Error as err: 
    # Error code 1062: https://dev.mysql.com/doc/refman/5.6/en/error-messages-server.html#error_er_dup_entry 
    if err.errno == errorcode.ER_DUP_ENTRY: 
     messages.add_message(request, messages.INFO, "Already taken") 
     return HttpResponseRedirect('sign_up') 

    # Error code 1054: https://dev.mysql.com/doc/refman/5.6/en/error-messages-server.html#error_er_bad_field_error 
    if err.errno == errorcode.ER_BAD_FIELD_ERROR: 
     messages.add_message(request, messages.INFO, "Invalid input") 
     return HttpResponseRedirect('sign_up') 

Edit:

Отредактированного ответ правильный в обоих Python2 и Python3.

В противном случае, если вы используете Python2, вы можете сделать что-то вроде этого.

try: 
    #execute the command 
    cursor.execute(sql) 
    #commit changes to the database 
    print 'success' 
    db.commit() 
except MySQLdb.Error, e: 
    if e.args[0] == 1062 or e.args[0] == 1054: 
     # e.args[0] is the error code in int format 
     # e.args[1] is the complete error message in str format 
     return e.args[1] 
    else: 
     # I didn't test all the cases, but this message 
     # can save you more time during the debug later 
     # if your code catch another error code rather than 1062 or 1054 
     return "Something odd happened" 

Также вы можете сделать что-то вроде этого (этот пример, если действительный для обоих Python2 и Python3):

try: 
    #execute the command 
    cursor.execute(sql) 
    #commit changes to the database 
    print 'success' 
    db.commit() 
except MySQLdb.Error as e: 
    if e[0] == 1062 or e[0] == 1054: 
     # e[0] is the error code in int format 
     # e[1] is the complete error message in str format 
     return e[1] 
    else: 
     # Good for the debug 
     return "Something odd happened" 
+0

У меня все еще есть проблема с выдачей настроенного текста, я получаю правильный код ошибки, однако он не находится на веб-сайте, как я хочу. Это просто отображение страницы ошибки Django. – Amon

+1

Вы имеете в виду во втором файле, где вы используете 'except mysql.connector.Error as e: ... return e'? –

+0

Не первый, должен ли я редактировать второй? – Amon

 Смежные вопросы

  • Нет связанных вопросов^_^