1. 程式人生 > >BBS登錄與註冊功能

BBS登錄與註冊功能

request python static ear login alert exti locals ria

登錄功能

視圖函數

def my_login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        name = request.POST.get('name')
        password = request.POST.get('password')
        code_text = request.POST.get('text')
        text = request.session.get('code_text')
        text = text.lower()
        user = authenticate(request, username=name, password=password)
        if user:
            if not text:
                return HttpResponse('驗證碼不能為空')
            if code_text == text:
                login(request, user)
                return HttpResponse('登錄成功')
            else:
                return HttpResponse('驗證碼錯誤')
        else:
            return HttpResponse('用戶名或密碼錯誤')

前端頁面:

<form>
                {% csrf_token %}
                <h2>登錄界面</h2>
                <hr>
                <div class="form-group">
                    <label for="name">用戶名</label>
                    <input type="text" name="name" id="name" class="form-control" placeholder="用戶名" required>
                </div>
                <div class="form-group">
                    <label for="password">密碼</label>
                    <input type="password" name="password" id="password" class="form-control" placeholder="密碼" required>
                </div>
                <div class="form-group">
                    <label for="valid_code">驗證碼</label>
                    <div class="row">
                        <div class="col-md-6">
                            <input type="text" name="valid_code" id="valid_code" class="form-control" required>
                        </div>
                        <img src="/get_code/" alt="" width="50%" height="35" id="img_code" draggable="false">
                    </div>

                </div>
            </form>
            <a href="/register/" class="btn btn-primary pull-left">註冊</a>
            <button type="button" class="btn btn-primary pull-right" id="btn">登錄</button>
            <a href="#" id="change" draggable="false" class="change pull-right">看不清,換一張</a>

<script>
$('#btn').click(function () {
        $.ajax({
            url: '/login/',
            type: 'post',
            data: {
                'csrfmiddlewaretoken': $('[name="csrfmiddlewaretoken"]').val(),
                'name': $('#name').val(),
                'password': $('#password').val(),
                'text': $('#valid_code').val()
            },
            success: function (data) {
                alert(data)
            }
        })
    });

    $('#change').click(function () {
        $('#img_code')[0].src += '?'
    })
</script>

註冊功能

froms組件

class MyForms(forms.Form):
    username = forms.CharField(max_length=18, min_length=2, label='用戶名',
                               error_messages={'max_length': '最長不超過18位', 'min_length': '最短為2個字符', 'required': '不能為空'},
                               widget=widgets.TextInput(attrs={'class': 'form-control', 'placeholder': '用戶名'}))
    password = forms.CharField(max_length=18, min_length=2, label='密碼',
                               error_messages={'max_length': '最長不超過18位', 'min_length': '最短為2個字符', 'required': '不能為空'},
                               widget=widgets.PasswordInput(attrs={'class': 'form-control', 'placeholder': '密碼'}))
    re_password = forms.CharField(max_length=18, min_length=2, label='確認密碼',
                                  error_messages={'max_length': '最長不超過18位', 'min_length': '最短為2個字符',
                                                  'required': '不能為空'},
                                  widget=widgets.PasswordInput(attrs={'class': 'form-control', 'placeholder': '確認密碼'}))
    email = forms.EmailField(label='郵箱', error_messages={'invalid': '不符合郵箱格式', 'required': '不能為空'},
                             widget=widgets.EmailInput(attrs={'class': 'form-control', 'placeholder': '郵箱'}))

    def clean_username(self):
        name = self.cleaned_data.get('username')
        user = models.UserInfo.objects.filter(username=name).first()
        if user:
            raise ValidationError('用戶名已存在')
        else:
            return name

    def clean(self):
        pwd = self.cleaned_data.get('password')
        re_pwd = self.cleaned_data.get('re_password')
        if pwd and re_pwd:
            if pwd == re_pwd:
                return self.cleaned_data
            else:
                raise ValidationError('兩次密碼不一致')

視圖函數

def my_register(request):
    if request.method == 'GET':
        myforms = MyForms()
        return render(request, 'register.html', locals())
    if request.is_ajax():
        response = {'status': 100, 'msg': None}
        myforms = MyForms(request.POST)
        if myforms.is_valid():
            data = myforms.cleaned_data
            data.pop('re_password')
            my_file = request.FILES.get('myfile')
            if my_file:
                data['avatar'] = my_file
            user = models.UserInfo.objects.create_user(**data)
        else:
            response['status'] = 101
            response['msg'] = myforms.errors
        return JsonResponse(response)

前端頁面

<body>
<div class="container-fluid">
    <div class="row">
        <div class="col-md-4 col-md-offset-4">
            <form id="form">
                <h2>註冊界面</h2>
                <hr>
                {% csrf_token %}
                {% for foo in myforms %}
                    <div class="form-group">
                        <label for="{{ foo.auto_id }}">{{ foo.label }}</label>
                        {{ foo }}
                    </div>
                {% endfor %}
                <div class="form-group">
                    <label for="myfile">頭像<img src="/static/img/default.png" id="img_file" alt="" width="40"
                                               height="40"></label>
                    <input type="file" id="myfile">
                </div>
            </form>
            <button type="button" class="btn btn-primary pull-right" id="btn">提交</button>
        </div>
    </div>
</div>
</body>
<script>
    // change為控件值發生變化時觸發的事件
    $('#myfile').change(function () {
        // 取出文件
        var file_obj = $('#myfile')[0].files[0];
        // 生成文件閱讀器對象,把獲取的圖片放到img
        try{
            var filereader = new FileReader();
            // 把圖片對象讀入閱讀器對象
            filereader.readAsDataURL(file_obj);
            // 等加載完畢後,渲染到img標簽中
            filereader.onload = function () {
                // filereader.result獲取閱讀器對象中的值
                $("#img_file").attr('src', filereader.result)
            }
         }catch (e) {

        }
    });

    $('#btn').click(function () {
        // 上傳文件使用formdata對象
        var formdata = new FormData();
        var formarr = $('#form').serializeArray();
        console.log(formarr);
        // jquery循環 循環往formdata對象中添加數據
        $.each(formarr, function (key, obj) {
            formdata.append(obj.name, obj.value)
        });
        // 添加文件對象數據
        formdata.append('myfile', $('#myfile')[0].files[0]);
        $.ajax({
            url: '/register/',
            type: 'post',
            processData: false,
            contentType: false,
            data: formdata,
            success: function (data) {
                if (data.status == '100'){
                    location.href = '/login/'
                }else {
                    var msg = data.msg;
                    $('span').remove();
                    for (i in msg){
                        console.log(i,msg[i]);
                        if (i == '__all__'){
                            $('#id_re_password').after('<span class="pull-right">'+ msg[i] + '</span>')
                        }
                        $('#id_'+i).after('<span class="pull-right">'+ msg[i] + '</span>')
                    }
                }
            }
        })
    })
</script>

BBS登錄與註冊功能