python 디자인 마이크로 소설 사이트(Django+Bootstrap 프레임 워 크 기반)

1.프로젝트 배경:
django 에 관 한 파일 업로드 와 페이지 기능 을 되 돌아 보기 위해 미니 소설 사 이 트 를 만들어 연습 할 계획 이다.오후 내 내 작은 프로젝트 를 썼 는데 그 중 에 많은 문제 가 있 었 지만 대부분 debug 를 통 해 해결 되 었 습 니 다.다른 부분 은 Pagination 플러그 인과 Bootstrap-FileInput 플러그 인의 공식 문 서 를 읽 었 습 니 다.
2.상세 한 디자인:
소설 사이트 의 사용자 모듈 기능 을 줄 이 고 소설 사이트 의 주요 기능 은 바로 파일 을 올 리 고 온라인 으로 소설 을 읽 는 것 이다.이 두 가지 기능 에 대하 여
주로 dajngo 에 내 장 된 Pagination 모듈 과 업로드 파일 플러그 인 을 선택 하면 됩 니 다.Bootsrap 전단 프레임 워 크 를 사용 하기 때문에 Bootsrap 에서 많은 사람 이 사용 하 는 FileInput 플러그 인 을 선 택 했 습 니 다.
대략적인 흐름:
4.567917.첫 페이지 에서 로 컬 txt 파일 을 서버 에 업로드 한 다음 첫 페이지 에서 업로드 한 txt 텍스트 파일 목록 을 비동기 로 업데이트 할 수 있 습 니 다.
4.567917.그리고 위 에서 읽 거나 삭제 하 는 동작 을 선택 할 수 있 습 니 다.읽 으 면 다른 페이지 로 이동 합 니 다.배경 에서 이 텍스트 파일 을 읽 고 페이지 를 나 누 어 작업 을 하여 전단 으로 돌아 갑 니 다.주요 절 차 는 이렇다.다음은 Pagination 과 FileInput 플러그 인과 핵심 코드 를 말씀 드 리 겠 습 니 다3.적당 한 도구:
Django 에 내 장 된 Pagination 은 페이지 기능 을 실현 합 니 다.이것 은 말 할 것 도 없 이 Django 로 웹 개발 페이지 기능 을 모두 사용 합 니 다.
Bootstrap 자체 가 upload file 파일 을 가지 고 플러그 인 을 업로드 하 는 것 은 너무 못 생 겼 고 기능 도 완선 되 지 않 았 습 니 다.그래서 Bootstrap FileInput 플러그 인 을 선 택 했 습 니 다.
버 전 선택:
  • Python 3.6.6
  • Django==2.1.7
  • Bootstrap v4.3.1
  • bootstrap-fileinput v4.5.2
  • 4.코드 상세 설명:
    먼저 코드 는 주로 두 조각 으로 나 뉘 는데 하 나 는 파일 업로드 후 파일 대상 을 받 아 지정 한 디 렉 터 리 에 저장 합 니 다.두 번 째 블록 은 txt 텍스트 파일 의 내용 을 읽 기 위해 페이지 를 나 누 어 전단 페이지 에 보 여 줍 니 다.
    먼저 파일 업로드 코드 를 말씀 드 리 겠 습 니 다.주로 전단 의 boottstrap-fileinputt 플러그 인 과 관련 됩 니 다.이 플러그 인 은 간단 한 HTML 파일 입력 을 고급 파일 선택 기 컨트롤 로 변환 합 니 다.JQuery 나 Javascript 을 지원 하지 않 는 브 라 우 저 는 정상 적 인 HTML 파일 입력 으로 되 돌아 가 는 데 도움 이 됩 니 다.

    이상 의 부분 은 공식 적 인 자기소개 입 니 다.제 개인 적 인 느낌 을 말씀 해 주세요.우선 이 플러그 인 은 대량 업로드,비동기 업로드 등 기능 을 지원 하 며 대부분의 JS 논리 적 코드 를 간소화 합 니 다.구체 적 으로 는 공식 API 문 서 를 따라 보고 파 라 메 터 를 수정 하면 됩 니 다.그 다음 에 업로드 할 때 진도 가 표시 되 고 업로드 의 완성 도 를 나타 내 는 데 사용 되 며 완성 도 를 직관 적 으로 나타 낸다.
    boottstrap-fileinput 의 github 주소:
    https://github.com/kartik-v/bootstrap-fileinput
    boottstrap-fileinput 의 공식 문서 주소:
    http://plugins.krajee.com/file-input
    boottstrap-fileinput 의 공식 데모:
    http://plugins.krajee.com/file-basic-usage-demo
    4.1 파일 업로드
    HTML 코드:
    
     <div dir=rtl class="file-loading">
     <input id="input-b8" name="input-b8" multiple type="file">
    </div>
    JS 코드:
    
    $(document).ready( function() {
    $("#input-b8").fileinput({
     rtl: true,
     uploadUrl: '/file_receive/',
     dropZoneEnabled: false,
     showPreview: false,
     allowedFileExtensions: ['txt'],
     initialPreviewConfig: []
    });
    });
    코드 설명:
    fileinput()방법 에 들 어 오 는 것 은 json 데이터 입 니 다.그 안에 여러 가지 속성 이 있 습 니 다.모든 수 치 는 컨트롤 을 업로드 할 때의 특성 을 초기 화 하 는 것 을 의미 합 니 다.설정 되 어 있 지 않 으 면 컨트롤 의 기본 속성 에 따라 설정 합 니 다.간단하게 몇 가지 속성의 설정 을 말 해 보 겠 습 니 다.uploadUrl:파일 주소 업로드;dropZone 활성화:드래그 영역 을 표시 할 지 여부;show Preview:미리 보기 영역 을 표시 할 지 여부;allowed FileExtensions:업로드 할 수 있 는 파일 형식 입 니 다.
    백그라운드 코드
    
    def file_receive(request):
     #   File-Input       
     if request.method == 'POST':
      file = request.FILES['input-b8']
      file_path = "static/books/"+file.name
      with open(file_path,"wb") as f:
       for chunk in file.chunks():
        f.write(chunk)
     return JsonResponse({'status':'success'})
    코드 설명:
    이상 은 배경 에서 파일 대상 을 받 고 저 장 된 코드 입 니 다.업로드 파일 의 크기 를 판단 하 는 방법 을 생략 하고 관심 있 는 것 은 with open()에 판단 을 추가 할 수 있 습 니 다.마지막 으로 파일 을 받 으 면 전단 에 json 데 이 터 를 되 돌려 줍 니 다.전단 플러그 인 은 되 돌아 오 는 JSON 데 이 터 를 받 아야 파일 업로드 성공 여 부 를 확인 할 수 있 고 bootstrap Fileinput 이 먼저 완료 되 는 상태 입 니 다.
    확장:
    여기 서 주의해 야 할 것 은 백 엔 드 에서 업 로드 된 파일 을 받 는 것 입 니 다.POST 를 통 해 업로드 되 지만 request.POST[filename]나 request.POST.get(filename,None)두 가지 방식 으로 접근 할 수 없습니다.
    다른 방식 으로
    request.FILES["filename"]또는 request.FILES.get("filename","None")
    다음은 파일 대상 을 얻 었 습 니 다.메모리 에 있 는 파일 을 하 드 디스크 에 기록 해 야 합 니 다.파일 을 읽 는 몇 가지 방법 과 속성:
  • filename.read():파일 에서 올 린 데 이 터 를 모두 읽 습 니 다.이 방법 은 작은 파일 에 만 적합 합 니 다
  • filename.chunks():블록 별로 파일 을 되 돌려 주 고 for 순환 을 통 해 교체 하면 큰 파일 을 블록 별로 서버 에 기록 할 수 있 습 니 다
  • filename.multiple_chunks():filename 파일 이 2.5M 이상 일 때 이 방법 은 True 로 돌아 갑 니 다.그렇지 않 으 면 false 로 돌아 갑 니 다.이 방법 에 따라 1 방법 을 선택 할 지 2 방법 을 선택 할 지 판단 할 수 있다
  • 4.2 업 로드 된 파일 목록 을 비동기 로 업데이트 합 니 다.
    HTML 코드:
    
    <div style="padding-top: 20px">
     <table id="book_list" class="table table-striped table-bordered table-hover">
      <tr>
       <th>    </th>
       <th>    </th>
       <th>    </th>
       <th>  </th>
      </tr>
      {% for book in objects %}
      <tr>
       <td>{{ book.name}}</td>
       <td>{{ book.book_time }}</td>
       <td>{{ book.book_size }}</td>
       <td><a href="/book_read/?book_name={{ book.name }}" rel="external nofollow" >  </a>
       <a href="/book_del/?book_name={{ book.name }}" rel="external nofollow" >  </a></td>
      </tr>
      {% endfor %}
     </table>
    </div>
    JS 코드:
    
    $("#input-b8").on('fileuploaded',function(){
     console.log('success');
     $.get('/book_update/',function(data){
      var book_html ="<tr>
    " + "<th> " + " </th>" + "<th> </th>" + "<th> </th>" + "<th> </th>"+ "</tr>"; console.log(data); for (var i in data){ book_html += "<tr><td>"+ data[i]['name']+"</td>" + "<td>"+data[i]['book_time']+"</td>" + "<td>"+data[i]['book_size']+"</td>" + "<td><a href=\"/book_read/?book_name="+data[i]['name']+"\"> </a>"+ "<a href=\"/book_del/?book_name="+data[i]['name']+"\"> </a></td>"+ "</tr>" } $("#book_list").html(book_html) console.log(book_html) }); });
    코드 설명:
    $("\#input-b8").on("fileuploaded",function(){})이 방법 은 파일 을 업로드 한 후 이벤트 의 함 수 를 되 돌려 줍 니 다.파일 을 업로드 하 는 데 성공 하면 이 방법 을 사용 하 는 것 을 말한다.그래서 나 는 파일 목록 을 업로드 하 는 코드 를 이 리 셋 이벤트 에 비동기 로 업데이트 할 것 이다.모든 파일 을 업로드 하면 배경 에 요청 하고 지정 한 디 렉 터 리 에 있 는 파일 목록 을 조회 하 며 json 형식의 데 이 터 를 만들어 프론트 데스크 로 돌아 갑 니 다.프론트 데스크 는 옮 겨 다 니 는 형식 으로 데 이 터 를 가 져 와 보 여 줍 니 다.구체 적 인 효 과 는 다음 과 같 습 니 다.

    백그라운드 코드
    
    def book_list():
     #   books      
     file_list = []
     filedir_path = "static/books/"
     list_file = os.listdir(filedir_path)
     for book in list_file:
      book_info = {}
      book_path = filedir_path + book
    
      book_info['name'] = book
      book_info['timestamp'] = os.path.getctime(book_path)
      book_info['book_time'] = time_format(book_info['timestamp'])
      book_info['book_size'] = os.path.getsize(book_path)
      file_list.append(book_info)
     books = sorted(file_list,key= lambda x:x['timestamp'],reverse=True)
     return books 
    
    def time_format(timestamp):
     #             
     time_struct = time.localtime(timestamp)
     time_string = time.strftime('%Y-%m-%d %H:%M',time_struct)
     return time_string 
    코드 설명:
    코드 는 간단 합 니 다.주로 os 모듈 을 통 해 정적 디 렉 터 리 static 의 books 디 렉 터 리 에 있 는 파일 목록 을 가 져 온 다음 에 모든 파일 의 시간 스탬프 를 가 져 오고 목록 유도 식 을 통 해 시간 스탬프 에 따라 key 값 으로 역방향 으로 정렬 합 니 다.
    4.3 문장 페이지 모듈
    HTML 코드:
    
    <div class="header text-center ">
     <a href="/index/" rel="external nofollow" style="float: left;">
      <i class="fa fa-home fa-2x" aria-hidden="true">Home</i>
     </a>
     <h3>{{ book_name }}</h3>
    </div>
    
    <div class="col-md-12 col-sm-offset-1 main">
     {% for content in book_content %}
     <span>{{ content }}</span>
     {% endfor %}
    </div>
    
    <div class="pagination">
     <div class="col-md-4 ">
      {% if book_content.has_previous %}
      <i class="fa fa-arrow-left" aria-hidden="true">
       <a href="?book_name={{ book_name }}&page={{ book_content.previous_page_number }}" rel="external nofollow" >
           
       </a>
      </i>
    
      {% endif %}
     </div>
    
     <div class="col-md-4 ">
      <h5>
        {{ book_content.number }} / {{ book_content.paginator.num_pages }} 
      </h5>
    
     </div>
     {% if book_content.has_next %}
     <div class="col-md-4 ">
      <a href="?book_name={{book_name}}&page={{ book_content.next_page_number }}" rel="external nofollow" >
          
      </a>
      <i class="fa fa-arrow-right" aria-hidden="true">
      </i>
     </div>
     {% endif %}
    </div>
    JS 코드:
    
    def book_read(request):
     #          
     if request.method == 'GET':
      book_name = request.GET['book_name']   #     
      file_path = "static/books/" + book_name   #     
    
      with open(file_path,encoding='gbk', errors='ignore') as f:
       book_contents = f.readlines()
    
      paginator = Paginator(book_contents, 50)
      try:
       page = int(request.GET['page']) #   
       book_content = paginator.page(page)
      except Exception as e:
       book_content = paginator.page(1)
      return render_to_response('book.html',{'book_content': book_content, 'book_name': book_name})
    코드 설명:
    파일 의 모든 줄 을 읽 고 목록 에 저장 합 니 다(list).줄 마다 요소 로 저 장 됩 니 다.그리고 페이지 를 나 눌 대상 목록 과 한 페이지 에 몇 개의 데 이 터 를 포함 하 는 지 실례 화 합 니 다.수신 전단 에서 전 송 된 페이지 에서 특정 페이지 의 데 이 터 를 가 져 와 전단 으로 전송 한다.


    확장:
    1.페이지 기능 은 Django 에 내 장 된 Paginator 클래스 가 제공 합 니 다.이 종 류 는 django/core/paginator 에 있 습 니 다.필요 한 곳 에서 가 져 오 면 됩 니 다.
    from django.core.paginator improt Paginator
    2.read(),readline(),readlines()방법의 차이:
    세 가 지 는 모두 파일 내용 을 읽 습 니 다.
  • read([size]):현재 위치 에서 size 바이트 를 읽 습 니 다.방법 에 인자 size 가 없 으 면 파일 이 끝 날 때 까지 읽 습 니 다.문자열 대상 을 되 돌려 줍 니 다
  • readline():방법 은 한 번 에 파일 한 줄 을 읽 고 이 방법 은 문자열 을 되 돌려 줍 니 다
  • readlines():전체 파일 의 모든 줄 을 읽 고 하나의 목록 에 저장 합 니 다.각 줄 은 하나의 요소 로 서
  • 3、Paginator 대상 조작:
    실례 화 대상:
    
    book_list = [1,2,3,4,5,6,7,8]
    book_content = Paginator(book_list,3)
    특정 페이지 의 데 이 터 를 가 져 옵 니 다.
    
    content = book_content.page(2)
    현재 페이지 번호:
    
    content.number
    페이지 를 나 눈 후의 총 페이지 수 를 검사 하 다.
    
    content.num_pages
    한 페이지 에 이전 페이지 가 있 는 지 확인 하거나 이전 페이지 의 번 호 를 조회 합 니 다.
    
    content.has_previous()
    content.previous_page_number()
    어떤 페이지 에 다음 페이지 가 있 는 지,아니면 다음 페이지 번호 가 있 는 지 조회 합 니 다.
    
    content.has_next()
    content.next_page_number()
    관심 있 는 학생 은 GitHub 에 올 라 갈 수 있 습 니 다.프로젝트 코드 의 주소:
    https://github.com/libuliduobuqiuqiu/noval_test
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기