묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결[개정판] 파이썬 머신러닝 완벽 가이드
5분 30초에 언급하신 덴스어레이?는 무엇일까요?
느낌은 약간 행열이다 이런 느낌인데, 이전에 언급없이 바로 나와서 궁금해집니다
-
미해결비전공자를 위한 개발자 취업 올인원 가이드 [통합편]
웹개발자 - 백엔드vs프론트 선택
안녕하세요 한정수 멘토님, 며칠전부터 해당 강의 차근차근 들으며 많은 도움 받고 있는 수강생입니다. 현재는 웹개발에서 프론트와 백엔드개발 사이에서 고민을 하고 있는 상황입니다. 그리고 저는 문과 졸업생이며, 이제 막 개발분야에 대해 준비를 하고 있는 중이며 향후 계획은 올해 안까지 취업을 목표로 준비를 하려고 하고 있습니다. 본론만 간략히 말씀드리면, 제가 해보고 싶은것은 백엔드개발자인데 취업엔 프론트엔드쪽이 유리한것 같아 이 점을 고민하고 있습니다. 그리고 한 가지 더 추가하면 SI쪽은 무조건 피하고 싶은 마음입니다. 제가 문과를 졸업하였고, 올해까지 취업을 목표로 하고있어 준비할 수 있는 기간도 그리 많지않은데 서비스회사 쪽으로의 백엔드개발자로 취업을 하려는 계획이 현실적으로 다소 무리가 있는 계획인지 궁금하여 질문올립니다. 물론 어느 쪽이라도 쉬운곳은 없고, 무조건 불가능하지도 않겠지만 6~8개월 준비하여 서비스회사로의 백엔드개발자로 취업을 할 수 있는 가능성이 얼마나 되는지 현실적으로 알고 싶습니다. 무조건 지키고 싶은 부분은, - 올해 내 취업 - 서비스회사 이 두 가지입니다. 이런 점에서 볼때, 프론트엔드쪽으로 준비하는게 맞는 것인지 고견 부탁드립니다. 제가 알기론, 프론트보다 백엔드쪽으로의 취업이 보다 어렵다고 들었는데, 굳이 프론트랑 비교하자면 조금 어려운 정도인지, 프론트로의 취업보다 의미가 있을 정도의 차이인지, 말이 길었는데, 유익한 강의 항상 감사드립니다 :) +수정) 한 가지 더 추가하자면, 서비스회사라면 소규모의 스타트업도 충분히 좋습니다.
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 기본편
추가 질문드립니다.
import requests from bs4 import BeautifulSoup import openpyxl fpath = r"C:\Users\OWNER\Desktop\python\주식.xlsx" wb = openpyxl.load_workbook(fpath) ws = wb.active codes = [ '005930', '000660', '035720' ] row = 2 for code in codes : url = f"https://finance.naver.com/item/sise.naver?code={codes}" response = requests.get(url) html = response.text soup = BeautifulSoup(html,'html.parser') price = soup.select_one('#_nowVal').text price = price.replace(',', '') print(price) wb.save(fpath) 값이 빈어서 출력이 됩니다...
-
해결됨스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
서버에서 클라이언트에 html이 아닌 다른 파일을 보내면 다운로드시키나요?
안녕하세요, 강의를 수강하던 도중 오타 때문에 다음과 같은 현상을 발견했습니다. 바로 다음과 같이 /servlet/members로 접근했을 때, 웹뷰가 아닌 members라는 파일을 다운로드시켜주는 현상이였습니다. 다음과 같은 현상을 겪은 이유는, 다음과 같이 setContentType에 오타를 발생시켰기 때문이였습니다. 그래서 나름대로 이러한 현상에 대해서 추리를 해보았는데, 브라우저는 html 파일만 열 수 있기 때문에 서버 단에서 html이 아닌 다른 파일을 보내면 클라이언트가 직접 다운로드할 수 있게 한다. 라는 생각이 들었습니다. 맞을까요? 그리고 이런 현상을 이용하면 보안적으로도 악용할 수도 있을 것이라 생각이 드는데 이것도 맞을까요?
-
미해결혼자 공부하는 머신러닝+딥러닝
합성곱 층 구성
1) keras.layers.Dense(64, activation='relu') keras.layers.Dense(10, activation='softmax') 위 코드에서 은닉층에서는 relu 함수를 사용하는 이유가 무엇인가요?! 2) 457p predict로 첫 번째 샘플의 10개의 확률값을 예측하고 난 후, preds = model.predict(val_scaled[0:1]) # (1,28,28,1)인 데이터 preds 그래프를 그릴 때, plt.bar(range(1,11), preds[0]) plt.xlabel('class') plt.ylabel('prob.') plt.show() 왜 preds의 인덱스값이 0이 되나요...?
-
미해결C# OpenCV 컴퓨터비전 입문 강좌
동영상 저장시 저장시간과 재생시간 상이함
동영상 저장시 재생시간과 동일시 할려면 어떻게 해야하나요 ? FPS를 맞춘다고 하셨는데..지금해주신 예제로 다시한번 설명 부탁드립니다.
-
미해결[신규 개정판] 이것이 진짜 크롤링이다 - 기본편
질문 드립니다..
import requests from bs4 import BeautifulSoup import openpyxl fpath = r"C:\Users\OWNER\Desktop\python\주식.xlsx" wb = openpyxl.load_workbook(fpath) ws = wb.active codes = [ '005930', '000660', '035720' ] row = 2 for code in codes : url = f"https://finance.naver.com/item/sise.naver?code={codes}" response = requests.get(url) html = response.text soup = BeautifulSoup(html,'html.parser') price = soup.select_one('#_nowVal').text price = price.replace(',','') print(price) ws[f'B{row}'] = int(price) row = row + 1 wb.save(fpath) 어떤오류인지 알 수가 없어서요..
-
미해결파이썬 알고리즘 문제풀이 입문(코딩테스트 대비)
스스로 작성한 코드 오류 질문드립니다.
선생님의 풀이처럼 토마토가 있는 경우를 모두 queue에 넣은 다음 bfs를 한번만 하는 것이아니라, 토마토가 있을 때마다 {queue에 넣고 bfs돌리고}를 반복하였습니다. 결과가 -1일때만 while문에 빠져서 답이 안나오는데 무엇이 문제일까요 ㅠㅠ 감사합니다~ import sys import copy from collections import deque from collections import defaultdict sys.stdin = open("input.txt","rt") def bfs(i,j): dq = deque() days[i][j]=1 #새로운 출발점 dq.append((i,j)) while dq: x,y = dq.popleft() for i in range(4): nx,ny = x+dx[i],y+dy[i] if 0<=nx<n and 0<=ny<m and nums[nx][ny]==0: #토마토 있음 if days[nx][ny] == 0: #아직 방문X days[nx][ny] = days[x][y]+1 dq.append((nx,ny)) elif days[x][y]+1 < days[nx][ny]: #기존보다 더 빨리 익을 수 있음 days[nx][ny]= days[x][y]+1 dq.append((nx,ny)) if __name__=="__main__": m, n = map(int,input().split()) nums = [list(map(int,input().split())) for _ in range(n)] #원래 토마토배열 days = copy.deepcopy(nums) #토마토 익는 데 걸리는 시간 dx = [0,0,-1,1] dy = [1,-1,0,0] answer = 0 for i in range(n): for j in range(m): if nums[i][j]==1: #원래 토마토있음 bfs(i,j) #정답계산 tmp = 0 for i in range(n): for j in range(m): if days[i][j]==0: #익지 않은 토마토 존재 print(-1) sys.exit() elif days[i][j]>tmp: #최대 횟수 tmp = days[i][j] if tmp ==1: #이미 다 익어있는 경우 print(0) else: print(tmp-1)
-
미해결실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
for문에서 변경감지 사용할 때 Exception 발생 문제
안녕하세요~ 현재 프로젝트를 진행하면서 롤백 문제를 만나게 되었는데, 제목처럼 한 트랜잭션 메소드 내에서 엔티티 List를 쿼리한 후 for 루프를 돌며 각 엔티티들의 상태값을 변경하는 로직 중에서 하나의 엔티티에서 Exception이 발생하면 모든 엔티티들에 대한 변경이 모두 롤백되어버리는 상황이 생겼습니다. 이 문제를 해결하고자 자식 트랜잭션에 전파속성을 NESTED로 주어보았는데 JPA에서는 지원하지 않는 듯 하고(NestedTransactionException 발생), 원래의 전체 엔티티를 조회해온 후 for 루프를 도는 방식에서, 단 건 엔티티를 쿼리한 후 하나의 회원 정보만 업데이트 하는 방식으로 문제를 해결하긴 하였지만, 쿼리가 처리해야할 엔티티 갯수만큼 추가적으로 발생하는 또 다른 문제가 생겨서 고민고민하다가 질문을 남겼습니다. 다른 좋은 해결 방법이 있을까요?? 문제 해결을 위한 방향을 알고 싶습니다! 아래는 대략적으로 재현한 예시 코드입니다. @Serviceclass MemberService( private val memberRepository: MemberRepository, private val memberShipService: MemberShipService) { @Transactional fun updateMemberShips() { getAllMembers().forEach { memberShipService.updateMemberShip(member) } }}@Serviceclass MemberShipService( private val externalClient: ExternalClient // 외부 API를 콜하는 인터페이스) { fun updateMemberShip(member: Member) { member.updateMemberShip() externalClient.sendEmail() // Exception 발생 가능 지점 }}
-
미해결1:1채팅 만들기(Android + Kotlin + Firebase)
안녕하세욤 강의 잘보고 있습니다
- 붙여 넣기 하는 와중에 auth 마지막 부분이 오류가 발생해요. 어떻게 할수 있을까요?? 강의 잘보고 있습니다. 꾸벅 는 1:1 문의하기를 이용해주세요.
-
미해결파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI, async, await)
싱글톤 패턴 관련해서 질문입니다!
안녕하세요 :) 라우터 내에서 매번 NaverBookScraper의 인스턴스를 만들어서 스크래핑을 하고 디비에 저장하는 과정으로 코드를 이해를 하였는데요. 혹시 여기서 매번 인스턴스를 만드는 이유가 있으실까요? 현재 코드에서는 싱글톤으로 라우터 밖에 생성해서 계속 그 인스턴스를 사용해도 되지않나 싶어서요. 혹시 이유가 따로 있으신건지 궁금합니다 :)
-
미해결파이썬 동시성 프로그래밍 : 데이터 수집부터 웹 개발까지 (feat. FastAPI, async, await)
search 함수 관련해서 질문이 있습니다.
search함수에서 [ [10개] , [10개] [10개]] -> [30개] 있는걸로 수정하시기 위해서 append하는 로직이 더 있는데요. ( reulst = [] 이후 코드 ) 해당 코드가 async with ~~ as seesion : 의 indent안에 꼭 있어야 되나 싶어서욥. await asyncio.gather (~ )로 데이터를 다 가져와서 all_data에 있는 상태일텐데 여기서 30개로 합치는 코드는 해당 indent가 아니라 밖에 있어도 되지않나 생각이 들었습니다. 혹시 그렇게 할 경우에 로직에 제가 놓친 이슈가 있을 부분이 있을까요? 그리고 저렇게 with 안에 전부 두신 이유가 있을지도 궁금합니다 :)
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-L 질문드립니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 정답 코드 10째 줄에 sort는 왜 하는건지 알 수 있을까요? 어차피 모두 돌면서 검사하는건데 sort를 하면 실행 속도에 차이가 있는건가요??
-
미해결공공데이터로 파이썬 데이터 분석 시작하기
그래프가 안그려집니다...
코드가 실행은 되는데 그래프가 안그려집니다..
-
미해결10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트
1-K 질문드립니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. for(int j = 0; j < cnt[i]; j += 2){ ret = char(i) + ret; ret += char(i); } 코드 맨 마지막 부분인 위 코드에서 알파벳들을 ret의 앞과 뒤에 하나씩 집어넣는데, 이해가 안돼서 질문드립니다.. ret = char(i) + ret 과 ret += char(i) 는 같은 코드 아닌가요..? 어떻게 양쪽 끝에 들어가는지 좀더 설명부탁드립니다!
-
미해결AWS(Amazon Web Service) 입문자를 위한 강의
IOT 관련 데이터 저장 질문드립니다.
출저: 선생님 안녕하세요. 이제 막 개발에 입문한 주니어 개발자 입니다.(주말에 선생님 강의 열심히 듣고 있네요. ㅎ) 위의 Q&A 과정 중에서 선생님이, 보통 IoT로 데이터를 받아올때 S3나 다이나모디비에 넣어두는 경우가 일반적입니다. 거기서 프로세싱을 거치기 위해 Lambda를 사용하는 경우도 있구요. 프로세싱된 데이터를 다시 다이나모디비에 넣을 수도 있고 RDS를 사용하여 다른 DB로 데이터를 보내기도 합니다. 여기서 IOT로 데이터를 받을때 왜 다이나모디비에 데이터를 넣고 프로세싱 하는지 궁금합니다. 프로세싱이 데이터를 시스템에 필요한 형태로 가공 처리를 하는 의미인것 같은데(프로세싱의 의미가 다르다면 말씀해 주세요...) 굳이 가공되지 않은 데이터를 데이터베이스에 1차적으로 저장하는지 궁금합니다. 혹시, 데이터가 IOT-클라우드 통신간 유실되는 방지하는 용도 일까요.? 답변 부탁 드립니다.!!!!
-
미해결애플 웹사이트 인터랙션 클론!
50vh
.scroll-section { position: relative; padding-top: 50vh; } 위와 같이 padding-top에 50vh를 넣고 setLayout함수에서 if (sceneInfo[i].type === 'sticky') { sceneInfo[i].scrollHeight = sceneInfo[i].heightNum * window.innerHeight; } else if (sceneInfo[i].type === 'normal') { sceneInfo[i].scrollHeight = sceneInfo[i].objs.content.offsetHeight + window.innerHeight * 0.5; } sceneInfo[i].objs.container.style.height = `${sceneInfo[i].scrollHeight}px`; sticky인 경우 innerHeight의 배수만큼만, normal인 경우 실제 높이에 50vh 만큼을 더해주고 있습니다. 질문1: 어짜피 setLayout에서 높이를 재설정하고 있는데 css에서 패딩을 주는 이유가 무엇일까요? 질문2: sticky와 normal에 50vh의 보정이 서로 다르게 들어가는 이유는 무엇일까요? 감사합니다~~
-
해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
연관관계와 관계가 없다?
영속성 전이가 연관 관계 세팅과 전혀 관계가 없다는 설명이 잘 이해가 되지 않습니다. 연관 관계가 맺어져 있어야 영속성 전이도 이루어질텐데 어떤 의미에서 이렇게 설명하신건지 궁금합니다. 감사합니다.
-
미해결[개정판] 딥러닝 컴퓨터 비전 완벽 가이드
강의 순서 관련 질문입니다. ^^
안녕하세요! 이전까지 MMDetection 실습 코드 설명이 끝난 뒤, SSD 개요 설명하사다가 갑자기 opencv_ssd_inference.ipynb을 설명하시는데, 설명하시는 걸 들어보니 tensorflow API를 이미 앞서 설명한 것처럼 말씀을 하셨습니다. 지금까지 강의에서 tensorflow는 처음 사용하셨는데 앞에 강의가 뭔가 빠진 느낌이네요 ^^ 21년 8월 이후 삭제한다고 되어 있는 강의 마지막 부분이 원래 이 영상 앞에 있었던 것인가요? 아울러, 권철민 강사님 깃헙에는 opencv_ssd_inference.ipynb 파일이 없습니다 ㅜㅜ 제가 무언가를 놓친 것인지 궁금합니다 :) 감사합니다!
-
해결됨남박사의 파이썬으로 실전 웹사이트 만들기
웹사이트 회원가입후 게시판으로 넘어가는 부분 질문 (join 부분)
안녕하세요 남박사님 도움을 많이 주셔서 강좌 잘 진행하고 있습니다! 몇일동안 헤매던것을 해결되서 정말 좋습니다! 궁금한 사항이 있어서 질문 올립니다. join창에서 회원가입을 하면 몽고db에 데이터가 정상적으로 넣어지는걸 확인할수있고 리스트란에서 게시물 작성 및 삭제등이 원활하게 이루어 지고 있습니다. 궁금한부분은 회원가입후 리스트나 로그인창으로 안넘어 가는거 같아서 질문을 올립니다! 회원로그인창으로 링크주소를 바꾸면 오류가 나는거 같더라구요.. 어떻게 해야할지 몰라서 질문 다시 올립니다! -회원가입- -회원 가입후- - 로그인 - -게시판 목록- -게시글 자성란- -게시글 작성후 - -회원가입 데이터- - run.py - from flask import Flask from flask import request from flask import render_template from flask_pymongo import PyMongo from bson.objectid import ObjectId from flask import abort from flask import redirect from flask import url_for from flask import flash from flask import session from functools import wraps import math import time from datetime import datetime, timedelta app = Flask(__name__) app.config["MONGO_URI"] = "mongodb://localhost:27017/myweb" app.config["SECRET_KEY"] = "abcd" app.config["PERMANENT_SESSION_LIFETIME"] = timedelta(minutes=30) mongo = PyMongo(app) def login_required(f): @wraps(f) def decorated_function(*args, **kwargs): if session.get("id") is None or session.get("id") == "": return redirect(url_for("member_login", next_url=request.url)) return f(*args, **kwargs) return decorated_function @app.template_filter('formatdatetime') def format_datetime(value): if value is None: return "" now_timestamp = time.time() offset = datetime.fromtimestamp( now_timestamp) - datetime.utcfromtimestamp(now_timestamp) value = datetime.fromtimestamp((int(value) / 1000)) + offset return value.strftime('%Y-%m-%d %H:%M:%S') @app.route("/list") def lists(): # 페이지 값 (값이 없는 경우 기본값는 1) page = request.args.get("page", 1, type=int) # 한페이지당 몇개의 게시물을 출력할지 limit = request.args.get("limit", 5, type=int) search = request.args.get("search", -1, type=int) keyword = request.args.get("keyword", "", type=str) # 최종적으로 완성된 쿼리를 만들 변수 query = {} # 검색어 상태를 추가할 리스트 변수 search_list = [] if search == 0: search_list.append({"title": {"$regex": keyword}}) elif search == 1: search_list.append({"contents": {"$regex": keyword}}) elif search == 2: search_list.append({"title": {"$regex": keyword}}) search_list.append({"contents": {"$regex": keyword}}) elif search == 3: search_list.append({"name": {"$regex": keyword}}) # 검색 대상이 한개라도 존재할 경우 query 변수에 $or 리스트를 쿼리 합니다. if len(search_list) > 0: query = {"$or": search_list} print(query) board = mongo.db.board datas = board.find({}).skip( (page - 1) * limit).limit(limit).sort("pubdate", -1) # 게시물의 총 갯수 tot_count = board.count_documents({}) # 마지막 페이지의 수를 구한다. last_page_num = math.ceil(tot_count / limit) # 페이지 블럭을 5개씩 표기 block_size = 5 # 현재 블럭의 위치 block_num = int((page - 1) / block_size) # 블럭의 시작 위치 block_start = int((block_size * block_num) + 1) # 블럭의 끝 위치 block_last = math.ceil(block_start + (block_size - 1)) return render_template("list.html", datas=list(datas), limit=limit, page=page, block_start=block_start, block_last=block_last, last_page_num=last_page_num, search=search, keyword=keyword) @ app.route("/view/<idx>") @login_required def board_view(idx): # idx = request.args.get("idx") if idx is not None: page = request.args.get("page") search = request.args.get("search") keyword = request.args.get("keyword") board = mongo.db.board # data = board.find_one({"_id": ObjectId(idx)}) data = board.find_one_and_update({"_id": ObjectId(idx)}, { "$inc": {"view": 1}}, return_document=True) if data is not None: result = { "id": data.get("_id"), "name": data.get("name"), "title": data.get("title"), "contents": data.get("contents"), "pubdate": data.get("pubdate"), "view": data.get("view"), "writer_id": data.get("writer_id", "") } return render_template("view.html", result=result, page=page, search=search, keyword=keyword) return abort(404) @ app.route("/write", methods=["GET", "POST"]) def board_write(): if session.get("id") is None: return redirect(url_for("member_login")) if request.method == "POST": name = request.form.get("name") title = request.form.get("title") contents = request.form.get("contents") print(name, title, contents) current_utc_time = round(datetime.utcnow().timestamp() * 1000) board = mongo.db.board post = { "name": name, "title": title, "contents": contents, "pubdate": current_utc_time, "writer_id": session.get("id"), "view": 0, } x = board.insert_one(post) print(x.inserted_id) return redirect(url_for("board_view", idx=x.inserted_id)) else: return render_template("write.html") @app.route("/join", methods=["GET", "POST"]) def member_join(): if request.method == "POST": name = request.form.get("name", type=str) email = request.form.get("email", type=str) pass1 = request.form.get("pass", type=str) pass2 = request.form.get("pass2", type=str) if name == "" or email == "" or pass1 == "" or pass2 == "": flash("입력되지 않은 값이 있습니다.") return render_template("join.html") if pass1 != pass2: flash("비밀번호가 일치하지 않습니다.") return render_template("join.html") members = mongo.db.members cnt = members.count_documents({"email": email}) if cnt > 0: flash("중복된 이메일 주소입니다.") return render_template("join.html") current_utc_time = round(datetime.utcnow().timestamp() * 1000) post = { "name": name, "email": email, "pass": pass1, "joindate": current_utc_time, "logintime": "", "logincount": 0, } members.insert_one(post) return "" else: return render_template("join.html") @app.route("/login", methods=["GET", "POST"]) def member_login(): if request.method == "POST": email = request.form.get("email") password = request.form.get("pass") next_url = request.form.get("next_url") members = mongo.db.members data = members.find_one({"email": email}) if data is None: flash("회원 정보가 없습니다.") return redirect(url_for("member_login")) else: if data.get("pass") == password: session["email"] = email session["name"] = data.get("name") session["id"] = str(data.get("_id")) session.permanent = True if next_url is not None: return redirect(next_url) else: return redirect(url_for("lists")) return redirect(url_for("lists")) else: flash("비밀번호가 일치하지 않습니다.") return redirect(url_for("member_login")) return "" else: next_url = request.args.get("next_url", type=str) if next_url is not None: return render_template("login.html", next_url=next_url) else: return render_template("login.html") @app.route("/edit/<idx>", methods=["GET", "POST"]) def board_edit(idx): if request.method == "GET": board = mongo.db.board data = board.find_one({"_id": ObjectId(idx)}) if data in None: flash("해당 게시물이 존재하지 않습니다.") return redirect(url_for("lists")) else: if session.get("id") == data.get("writer_id"): return render_template("edit.html", data=data) else: flash("글 수정 권한이 없습니다.") return redirect(url_for("lists")) else: title = request.form.get("title") contains = request.form.get("contents") board = mongo.db.board data = board.find_one({"_id": ObjectId(idx)}) if session.get("id") == data.get("writer_id"): board.update_one({"_id": ObjectId(idx)}, { "$set": { "title": title, "contents": contains, } }) flash("수정 되었습니다.") return redirect(url_for("board_view", idx=idx)) else: flash("글 수정 권한이 없습니다.") return redirect(url_for("lists")) @app.route("/delete/<idx>") def board_delete(idx): board = mongo.db.board data = board.find_one({"_id": ObjectId(idx)}) if data.get("writer_id") == session.get("id"): board.delete_one({"_id": ObjectId(idx)}) flash("삭제 되었습니다.") else: flash("삭제 권한이 없습니다.") return redirect(url_for("lists")) if __name__ == "__main__": app.run(host="0.0.0.0", debug=True, port=9000) --------------------------------------------------------------------------------- -join- {% with messages = get_flashed_messages() %} {% if messages %} <script> alert("{{messages[-1]}}"); </script> {% endif %} {% endwith %} <table> <form name="form" action="/join" method="POST"> <thead> <caption> 회원가입 </caption> </thead> <tbody> <tr> <td>이름</td> <td><input type="text" name="name" /></td> </tr> <tr> <td>이메일</td> <td><input type="text" name="email" /></td> </tr> <tr> <td>비밀번호</td> <td><input type="password" name="pass" /></td> </tr> <tr> <td>비밀번호 확인</td> <td><input type="password" name="pass2" /></td> </tr> <tr> <td colspan="2"><input type="submit" value="가입하기" /></td> </tr> </tbody> </form> </table> --------------------------------------------------------------------------------------- -login- {% with messages = get_flashed_messages() %} {% if messages %} <script> alert("{{messages[-1]}}"); </script> {% endif %} {% endwith %} <table> <form name="form" action="/login" method="POST"> {% if next_url %} <input type="hidden" name="next_url" value="{{next_url}}" /> {% endif %} <thead> <caption> 회원 로그인 </caption> </thead> <tbody> <tr> <td>이메일</td> <td><input type="text" name="email" /></td> </tr> <tr> <td>비밀번호</td> <td><input type="password" name="pass" /></td> </tr> <tr> <td colspan="2"><input type="submit" value="로그인" /></td> </tr> </tbody> </form> </table> ------------------------------------------------------------------------------------ -list- {% with messages = get_flashed_messages() %} {% if messages %} <script> alert('{{messages[-1]}}'); </script> {% endif %} {% endwith %} <script> function search() { var v_search = document.getElementById("search").value; var v_keyword = document.getElementById("keyword").value; if (v_search == "" || v_keyword == "") { return false; } else { self.location.href = "{{url_for('lists')}}?search=" + v_search + "&keyword=" + v_keyword; } } </script> {% if datas|length > 0 %} <table> <thead> <tr> <td>번호</td> <td>제목</td> <td>이름</td> <td>날짜</td> <td>조회수</td> </tr> </thead> <tbody> <!--반복되는 구간--> <tr> {% for data in datas %} <td>{{loop.index + ((page - 1) * limit)}}</td> <td> <a href="{{url_for('board_view', idx=data._id, page=page, search=search, keyword=keyword)}}">{{data.title}}</a> </td> <td>{{data.name}}</td> <td>{{data.pubdate|formatdatetime}}</td> <td>{{data.view}}</td> </tr> {% endfor %} <!--반복되는 구간 끝--> </tbody> </table> {% if block_start - 1 > 0 %} <a href="{{url_for('lists', page=block_start - 1, search=search, keyword=keyword)}}">[이전]</a> {% endif %} {% for i in range(block_start, block_last + 1) %} {% if i > last_page_num %} {{ i }} {% else %} {% if i == page %} <b>{{ i }}</b> {% else %} <a href="{{url_for('lists', page=i, search=search, keyword=keyword)}}">{{ i }}</a> {% endif %} {% endif %} {% endfor %} {% if block_last < last_page_num %} <a href="{{url_for('lists', page=block_last + 1, search=search, keyword=keyword)}}">[다음]</a> {% endif %} <select name="search" id="search"> <option value="" {% if search=='' or search==-1 %} selected {% endif %}>검색대상</option> <option value="0" {% if search==0 %} selected {% endif %}>제목</option> <option value="1" {% if search==1 %} selected {% endif %}>내용</option> <option value="2" {% if search==2 %} selected {% endif %}>제목+내용</option> <option value="3" {% if search==3 %} selected {% endif %}>작성자</option> </select> <input type="text" name="keyword" id="keyword" {% if keyword !="" %} value="{{keyword}}" {% endif %} /> <input type="button" value="검색" onclick="search()" /> {% else %} <h3>데이터가 없습니다.</h3> {% endif %} <a href="{{url_for('board_write')}}">글작성</a> ---------------------------------------------------------------------------------------- -view- <html> {% with messages = get_flashed_messages() %} {% if messages %} <script> alert("{{messages[-1]}}"); </script> {% endif %} {% endwith %} {{result.title}} <br /> {{result.name}} <br /> {{result.pubdate|formatdatetime}} <br /> {{result.view}} <br /> {{result.contents}} <br /> <a href="{{url_for('lists', page=page, search=search, keyword=keyword)}}" >리스트</a > {% if session["id"] == result.writer_id %} <a href="{{url_for('board_delete', idx=result.id)}}">글삭제</a> <a href="{{url_for('board_edit', idx=result.id)}}">글수정</a> {% endif %} </html> ---------------------------------------------------------------------------------------------------- -write- <html> <body> <table> <form name="form" method="post" action="/write"> <tr> <td>작성자</td> <td><input type="text" name="name" value="{{session['name']}}" readonly /></td> </tr> <tr> <td>제목</td> <td><input type="text" name="title" /></td> </tr> <tr> <td>내용</td> <td><textarea type="text" name="contents"></textarea></td> </tr> <tr> <td colspan="2"><input type="submit" /></td> </tr> </form> </table> </body> </html> ------------------------------------------------------------------------------------------------------ -edit- <html> <body> <table> <form name="form" method="post" action="/edit/{{data._id}}"> <tr> <td>작성자</td> <td><input type="text" name="name" value="{{session['name']}}" readonly /></td> </tr> <tr> <td>제목</td> <td><input type="text" name="title" /></td> </tr> <tr> <td>내용</td> <td><textarea type="text" name="contents">{{data.contents}}</textarea></td> </tr> <tr> <td colspan="2"><input type="submit" /></td> </tr> </form> </table> </body> </html> -