Skip to content

Commit 5a46d59

Browse files
committed
'更新了Django示例代码'
1 parent dd4e41f commit 5a46d59

File tree

15 files changed

+187
-46
lines changed

15 files changed

+187
-46
lines changed

Day41-55/code/hellodjango/demo/admin.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
from django.contrib import admin
22

3-
from demo.models import Teacher, Subject
3+
from demo.models import Teacher, Subject, User
4+
5+
6+
class UserAdmin(admin.ModelAdmin):
7+
list_display = ('no', 'username', 'email', 'counter')
8+
ordering = ('no', )
49

510

611
class SubjectAdmin(admin.ModelAdmin):
@@ -16,4 +21,5 @@ class TeacherAdmin(admin.ModelAdmin):
1621

1722
admin.site.register(Subject, SubjectAdmin)
1823
admin.site.register(Teacher, TeacherAdmin)
24+
admin.site.register(User, UserAdmin)
1925

Day41-55/code/hellodjango/demo/apps.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22

33

44
class DemoConfig(AppConfig):
5-
name = 'demo'
5+
name = '投票'

Day41-55/code/hellodjango/demo/forms.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44

55

66
class UserForm(forms.ModelForm):
7-
username = forms.CharField(widget=forms.TextInput, min_length=6, max_length=20, help_text='请输入用户名')
8-
password = forms.CharField(widget=forms.PasswordInput, min_length=8, max_length=20, help_text='请输入密码')
9-
email = forms.CharField(widget=forms.EmailInput, max_length=255, help_text='请输入邮箱')
7+
username = forms.CharField(widget=forms.TextInput, min_length=6, max_length=20)
8+
password = forms.CharField(widget=forms.PasswordInput, min_length=8, max_length=20)
9+
email = forms.CharField(widget=forms.EmailInput, max_length=255)
1010

1111
class Meta(object):
1212
model = User
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# 序列化 - 把对象写入数据流 - 串行化 / 归档 / 腌咸菜
2+
# 反序列化 - 从数据流中恢复出对象 - 反串行化 / 解归档
3+
# Python有三个支持序列化的模块
4+
# json - JSON / pickle - 二进制 / shelve
5+
import json
6+
import pickle
7+
8+
9+
class Student(object):
10+
11+
def __init__(self, name, age):
12+
self.name = name
13+
self.age = age
14+
15+
16+
if __name__ == '__main__':
17+
list1 = [10, 'hello', 99.9, 'goodbye']
18+
print(json.dumps(list1))
19+
print(pickle.dumps(list1))
20+
dict1 = {'name': '骆昊', 'age': 38}
21+
print(json.dumps(dict1))
22+
print(pickle.dumps(dict1))
23+
stu = Student('骆昊', 38)
24+
print(pickle.dumps(stu))
25+
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Generated by Django 2.0.6 on 2018-07-06 06:58
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('demo', '0004_auto_20180705_1017'),
10+
]
11+
12+
operations = [
13+
migrations.AlterModelOptions(
14+
name='teacher',
15+
options={'ordering': ('no',), 'verbose_name': '讲师', 'verbose_name_plural': '讲师'},
16+
),
17+
migrations.AddField(
18+
model_name='user',
19+
name='counter',
20+
field=models.IntegerField(default=3, verbose_name='票数'),
21+
),
22+
]

Day41-55/code/hellodjango/demo/models.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,6 @@
33
from django.db import models
44
from django.db.models import PROTECT
55

6-
# 高内聚 低耦合
7-
# 面向对象七个设计原则
8-
# 单一职责原则 / 开闭原则 / 依赖倒转原则 / 里氏替换原则 / 接口隔离原则 / 合成聚合复用原则 / 迪米特法则
9-
# 1995年 - GoF - 23个设计模式
10-
# 创建型模式中的原型模式
116
proto = sha1()
127

138

@@ -16,6 +11,7 @@ class User(models.Model):
1611
username = models.CharField(max_length=20, unique=True, verbose_name='用户名')
1712
password = models.CharField(max_length=40, verbose_name='口令')
1813
email = models.CharField(max_length=255, verbose_name='邮箱')
14+
counter = models.IntegerField(default=3, verbose_name='票数')
1915

2016
def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
2117
hasher = proto.copy()
@@ -68,4 +64,4 @@ class Meta(object):
6864
db_table = 'tb_teacher'
6965
verbose_name = '讲师'
7066
verbose_name_plural = '讲师'
71-
ordering = ('name', )
67+
ordering = ('no', )

Day41-55/code/hellodjango/demo/views.py

Lines changed: 51 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@ def login(request):
1818
hasher = proto.copy()
1919
hasher.update(password.encode('utf-8'))
2020
if hasher.hexdigest() == user.password:
21+
request.session['user'] = user
2122
return redirect('sub')
2223
except User.DoesNotExist:
2324
pass
2425
return render(request, 'demo/login.html',
2526
{'hint': '用户名或密码错误'})
2627

2728

28-
2929
def register(request):
3030
form = UserForm()
3131
if request.method.lower() == 'get':
@@ -44,29 +44,64 @@ def register(request):
4444
return render(request, 'demo/register.html', ctx)
4545

4646

47+
def check_username(request):
48+
ctx = {}
49+
if 'username' in request.GET:
50+
username = request.GET['username']
51+
try:
52+
User.objects.get(username__exact=username)
53+
ctx['valid'] = False
54+
except User.DoesNotExist:
55+
ctx['valid'] = True
56+
return HttpResponse(json.dumps(ctx),
57+
content_type='application/json; charset=utf-8')
58+
59+
4760
def show_subjects(request):
48-
ctx = {'subjects_list': Subject.objects.all()}
49-
return render(request, 'demo/subject.html', ctx)
61+
if 'user' in request.session and request.session['user']:
62+
ctx = {'subjects_list': Subject.objects.all()}
63+
return render(request, 'demo/subject.html', ctx)
64+
else:
65+
return render(request, 'demo/login.html',
66+
{'hint': '请先登录!'})
5067

5168

5269
def show_teachers(request, no):
53-
teachers = Teacher.objects.filter(subject__no=no)
54-
ctx = {'teachers_list': teachers}
55-
return render(request, 'demo/teacher.html', ctx)
70+
if 'user' in request.session and request.session['user']:
71+
teachers = Teacher.objects.filter(subject__no=no)\
72+
.select_related('subject')
73+
ctx = {'teachers_list': teachers}
74+
return render(request, 'demo/teacher.html', ctx)
75+
else:
76+
return render(request, 'demo/login.html',
77+
{'hint': '请先登录!'})
5678

5779

5880
def make_comment(request, no):
5981
ctx = {'code': 200}
60-
try:
61-
teacher = Teacher.objects.get(pk=no)
62-
if request.path.startswith('/good'):
63-
teacher.good_count += 1
64-
ctx['result'] = f'好评({teacher.gcount})'
82+
if 'user' in request.session and request.session['user']:
83+
user = request.session['user']
84+
if user.counter > 0:
85+
try:
86+
teacher = Teacher.objects.get(pk=no)
87+
if request.path.startswith('/good'):
88+
teacher.good_count += 1
89+
ctx['result'] = f'好评({teacher.gcount})'
90+
else:
91+
teacher.bad_count += 1
92+
ctx['result'] = f'差评({teacher.bcount})'
93+
teacher.save()
94+
user.counter -= 1
95+
User.objects.filter(username__exact=user.username)\
96+
.update(counter=user.counter)
97+
request.session['user'] = user
98+
except Teacher.DoesNotExist:
99+
ctx['code'] = 404
65100
else:
66-
teacher.bad_count += 1
67-
ctx['result'] = f'差评({teacher.bcount})'
68-
teacher.save()
69-
except Teacher.DoesNotExist:
70-
ctx['code'] = 404
101+
ctx['code'] = 403
102+
ctx['result'] = '票数不足'
103+
else:
104+
ctx['code'] = 302
105+
ctx['result'] = '请先登录'
71106
return HttpResponse(json.dumps(ctx),
72107
content_type='application/json; charset=utf-8')

Day41-55/code/hellodjango/hellodjango/settings.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,10 @@
2727

2828
ALLOWED_HOSTS = []
2929

30+
SESSION_EXPIRE_AT_BROWSER_CLOSE = False
31+
SESSION_COOKIE_AGE = 1800
3032

3133
# Application definition
32-
3334
INSTALLED_APPS = [
3435
'django.contrib.admin',
3536
'django.contrib.auth',
@@ -73,7 +74,6 @@
7374

7475
# Database
7576
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases
76-
7777
DATABASES = {
7878
'default': {
7979
'ENGINE': 'django.db.backends.mysql',
@@ -88,7 +88,6 @@
8888

8989
# Password validation
9090
# https://docs.djangoproject.com/en/2.0/ref/settings/#auth-password-validators
91-
9291
AUTH_PASSWORD_VALIDATORS = [
9392
{
9493
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
@@ -107,7 +106,6 @@
107106

108107
# Internationalization
109108
# https://docs.djangoproject.com/en/2.0/topics/i18n/
110-
111109
LANGUAGE_CODE = 'zh-hans'
112110

113111
TIME_ZONE = 'Asia/Chongqing'
@@ -120,10 +118,28 @@
120118

121119
USE_TZ = True
122120

121+
SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'
123122

124123
# Static files (CSS, JavaScript, Images)
125124
# https://docs.djangoproject.com/en/2.0/howto/static-files/
126125
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]
127126
STATIC_URL = '/static/'
128127

129128
# APPEND_SLASH = False
129+
130+
# DEBUG < INFO < WARNING < ERROR < CRITICAL
131+
LOGGING = {
132+
'version': 1,
133+
'disable_existing_loggers': False,
134+
'handlers': {
135+
'console': {
136+
'class': 'logging.StreamHandler',
137+
},
138+
},
139+
'loggers': {
140+
'django': {
141+
'handlers': ['console'],
142+
'level': os.getenv('DJANGO_LOG_LEVEL', 'DEBUG'),
143+
},
144+
},
145+
}

Day41-55/code/hellodjango/hellodjango/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
path('', views.login),
2323
path('login/', views.login),
2424
path('register/', views.register),
25+
path('check/', views.check_username),
2526
path('subjects/', views.show_subjects, name='sub'),
2627
path('subjects/<int:no>/', views.show_teachers),
2728
path('good/<int:no>/', views.make_comment),
Lines changed: 3 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)