장고 초보자. 임씨는 Uni에서 웹 프로그래밍 과정을 배정 받았다.장고 페이지 방문 카운터 동시성
from django.db import models
# Create your models here.
class HitCount(models.Model):
count = models.IntegerField()
그리고 내가보기 파일에이 코드를 사용 :
<p>{{count}}</p>
이 작동하는 것 같다 : 이것은 내 index.html 파일이
def index(request):
#try getting a hitcounter, if there is none, create one
try:
hc = HitCount.objects.get(pk=1)
except:
hc = HitCount(count=0)
hc.save()
pass
#get a queryset containing our counter
hc = HitCount.objects.filter(pk=1)
#increment its count and update it in db
hc.update(count=F('count')+1)
#ATM hc is a queryset, so hc.count will just return how many
#counters are in the queryset (1). So we have to get the
#actual counter object
hc = HitCount.objects.get(pk=1)
#and return its count
return render_to_response('hitcount/index.html', {'count': hc.count})
이다 나는 클래스 HitCount했다 그냥 괜찮아요,하지만 궁금해 :
- 이것은 합리적인 방법인가요? 이러는거야? 증분 코드가 실제로 뷰 파일에 있어야합니까? 아니면 클래스의 메서드로 옮겨야합니까?
- 이 동시성은 안전합니까? 아니면 어떤 종류의 잠금을 사용해야합니까? 과제의 일부는 카운터의 동시성을 안전하게하는 것입니다. 트랜잭션을 사용하는 SQLite를 사용하므로 문제가없는 것으로 생각했지만 뭔가 누락되었을 수 있습니다.
거래가 자동으로 사용되지 않습니다.MySQL을 사용한다면 ORM의 멋진 점을 제거 할지라도 이것은 단일 질의로 수행 될 수 있습니다 : INSERT INTO hitcount (id, count) VALUES (1,1) ON DUPLICATE KEY UPDATE count = count +1 '이다. 이렇게하면 트랜잭션이 필요 없습니다. (오라클이나 SQL 서버에서는'MERGE INTO'를, PostgreS에서는 UDF를 사용할 수 있습니다.) –
입력에 유쾌합니다. 조금 더 확장 해 주시겠습니까? 예 : 어떻게 거래를 강제로 사용합니까? 그리고 수동 쿼리를 사용하면 트랜잭션이 필요하지 않습니다. 그렇다면 두 개의 쿼리가 동시에 수행되어 오류가 발생할 위험이 있습니까? – fred
Django가 트랜잭션을 처리하는 방법과 Django를 가질 수있는 방법에 대한 정보는 [here] (https://docs.djangoproject.com/en/dev/topics/db/transactions/#django-s-default-transaction-behavior)를 참조하십시오. 자동으로 트랜잭션을 사용합니다. 나의 대체 제안에 관해서는, 각 갱신은 단일 명령문에서 수행되고 데이터베이스 서버에 의해 원자 단위로 처리되므로 트랜잭션이 없습니다. –