웹찢남

Django 2일차 (migrate 에러, src image, prototype) 본문

BACK_END/Django 공부

Django 2일차 (migrate 에러, src image, prototype)

harry595 2020. 8. 11. 20:30

게시판대신 대회때 구현해볼 페이지에 대해서 프로토타입 느낌으로

간단하게 서비스를 재현해볼 예정이다.

물론 대회때는 처음부터 코드를 짤 예정이다.

 

 

src image

 

html에 image를 넣는게 은근히 헷갈렸다.

html에서 그냥 이미지를 추가하듯이 해봤는데

계속 이미지가 깨져서 스트레스를 받았다.

django에서 image를 넣는 법은 다음과 같다.

 

STATIC_URL = '/static/'

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'user', 'static')
]

STATIC_ROOT = os.path.join(BASE_DIR, 'static')

 

위의 코드를 settings.py에 넣는다.

이때 os.path.join 속의 user은 app의 이름이다.

 

또한 static 폴더를 app 폴더 내에 만든 후

필자의 경우 static 폴더 내부에 image 폴더를 작성했다.

 

그 후 html에서 이미지를 불러올 차례인데

이 때 {% load static %}을 html 내부에 기입하여야 한다.

 

<a href="/user/search">
  <img src="{% static 'image/search.png' %}" />
</a>

 

그후 위의 방식으로 내부에 코드를 작성하면 img를 불러올 수 있다.

 

 

 

 

 

삭제한 테이블 migrate 에러

 

테이블을 수정할 부분이 있어 테이블을 그냥 지운 후 migrate를 해봤다.

그런데 테이블이 생기기는 커녕

Running migrations:
  No migrations to apply.

이렇게 나온다...

 

이때의 해결법은 해당 db에 들어가 django_migrations 테이블 내에

지웠던 migration을 삭제한 후 다시 migrate를 하면된다.

  

 

 

오늘 구현해본 사이트

 

대회때 만들 피싱 사이트 탐지 페이지를 진짜 대충 짜봤다.

시간이 제한적이고 기계학습까지 추가해야해서 

django에 시간이 많이 들어가면 안된다 판단해서

익숙해지기 위해서 만들어봤다.

 

프론트앤드에 대해서 욕먹어도 싸고

대충 만들어 보는 페이지에 django를 3일 공부하고 만든 페이지여서

코드가 불편하시더라도 너그러운 마음으로 봐주세요..

 

 

 

 

1. 메인 페이지

 

 

위 페이지는 index 페이지로 단순하게 만들어 봤다.

위에 세개의 이미지가 있는데 이는 각각의 페이지로 링크가 걸려있다.

코드는 다음과 같다.

 

views.py

def index(request):
    return render(request, 'user/index.html')

urls.py-urlpatterns

path('', views.index, name='index'),

 

index.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Trillion Guard</title>
  </head>
  <body>
    <a href="/user">
      <img src="{% static 'image/logo2.png' %}" />
    </a>

    <a href="/user/search">
      <img src="{% static 'image/search.png' %}" />
    </a>

    <a href="/user/board">
      <img src="{% static 'image/ranking.png' %}" />
    </a>

    <h1>Trillion Guard</h1>
    피싱사이트 탐지 해드려요~
  </body>
</html>

 

 

2. 검색 페이지

 

 

views.py

class search_VIEW(View):
    def get(self, request):
        return render(request, 'user/search.html')

    def post(self, request):
        entry_url = request.POST['url']
        if entry_url:
            return render(request, 'user/search.html', {'url': '%s' % entry_url, 'check': 'true'})
        return render(request, 'user/search.html')

get 방식으로 해당 페이지를 들어갈때는 인자를 넘기지 않는다

하지만 검색 버튼을 통해 post 방식으로 접근하게 된다면 접근한 url 과 check를 뱉는다.

이때 기계학습에서 pickle을 로드해서 여부를 판단하는 코드가 들어갈 것이다.

 

 

urls.py-urlpatterns

path('search/', views.search_VIEW.as_view(), name='search'),

 

index.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Trillion Guard</title>
  </head>
  <body>
    <a href="/user">
      <img src="{% static 'image/logo2.png' %}" />
    </a>

    <a href="/user/search">
      <img src="{% static 'image/search.png' %}" />
    </a>

    <a href="/user/board">
      <img src="{% static 'image/ranking.png' %}" />
    </a>
    <h1>Trillion Guard</h1>
    피싱사이트 검색해주세요~
    <form action="./" method="post">
      의심 URL: <input type="text" name="url" />
      {% csrf_token %}
      <input type="submit" value="검색" />
    </form>
    {% if url %}
    <h3>검색 url: {{url}}</h3>
    <h3>결과: {{check}}</h3>
    {% endif %}
  </body>
</html>

html 중간중간에 python 코드를 넣을 수 있어서 참 좋다.

 

 

 

3. 피싱 검색 횟수 순위 페이지

 

 

 

 

views.py

class board_VIEW(View):
    def get(self, request):
        board_list = Board2.objects.order_by('-hits')
        context = {'board_list': board_list}
        return render(request, 'user/pagee.html', context)

board2라는 db의 테이블 내의 정보를 hits 기준으로 정렬시킨다.

이때 hits 앞에 - 가 붙었는데 이는 내림차순으로 정렬시킨다는 뜻이다.

context를 통해 html에 board_list를 전달한다.

 

urls.py-urlpatterns

path('board/', views.board_VIEW.as_view(), name='board'),

 

index.html

{% load static %}
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>일별 검색 순위</title>
  </head>
  <body>
    <a href="/user">
      <img src="{% static 'image/logo2.png' %}" />
    </a>

    <a href="/user/search">
      <img src="{% static 'image/search.png' %}" />
    </a>

    <a href="/user/board">
      <img src="{% static 'image/ranking.png' %}" />
    </a>
    <h1>일별 검색 순위</h1>
    <table border="1">
      <th>Ranking</th>
      <th>URL</th>
      <th>날짜</th>
      <th>조회수</th>
      {% for board in board_list %}
      <tr>
        <td>{{ forloop.counter}}</td>
        <td>{{ board.url}}</td>
        <td>{{ board.date}}</td>
        <td>{{ board.hits}}</td>
      </tr>
      {% endfor %}
    </table>
  </body>
</html>

 

for문을 통해서 일별 검색 순위를 구현하였다.

여기서 forloop.counter는 for문이 몇번 돌았는지를 의미한다.

변수를 따로 선언해야하나 고민하면서 찾았는데

이런 좋은 기능이 있다니 다 차려진 밥상에 숟가락 올리는 언어같다.

코드를 대충 짜보니 대회때도 얼마 시간이 안걸릴것같다는 느낌이 들었다.

 

내일은 페이징 처리 구현을 해봐야겠다.

Comments