1
from flask import Flask, session
cs

 

import 해서 쓴다

 

 

1
2
3
app.secret_key = 'secretkey'
session.permanent = True
app.permanent_session_lifetime = timedelta(seconds=10)
cs

 

secret_key를 어렵게 해서 만들어 줘야만 함

 

session.permanent는 session의 사용시간을 영구적으로 사용할지에 대한 옵션이다

-기본값 False

(그런데 True로 안해주면 lifetime 제어가 안먹히더라)

 

app.permanent_session_lifetime = timedelta(seconds=10) 은 세션의 사용시간 설정이다

-minuts, hour 등의 옵션이 있다

 

 

1
2
3
4
if 'username' in session:  # session안에 username이 있으면 로그인
    return render_template('index_login.html', current_user=session['username'])
 
session.pop('username'None)
cs

 

사용하는 걸 보면 알 수 있는 것처럼 List 타입 사용하는 것처럼 쓰면 된다 

아마 중복이 되면 안될테니 Set 타입의 컬렉션일 듯하다

 

session이라 붙여놓고 cookie에 들어오길래 진정한 정체가 뭔지 알 수 없는 이상한 기능이다

(session은 서버에서 저장, cookie는 사용자 브라우저에 저장)

 

브라우저 개발자 도구를 통해 확인해 보니 GC가 동작하지 않는지, 아니면 느려서 그런지

그도 아니면 그냥 key 값만 남기고 value는 빈문자열인 상태로 메모리에 상주하는지 로그아웃 구현 후에도 계속 남아있다

(어차피 session이라면 브라우저 종료 시 사라지겠지만 개발자도구에 cookie라고 표기 되어있는게 찜찜함)

 

 

그래서

1
2
3
4
def do_logout():
    session.pop('username'None)
    app.permanent_session_lifetime = timedelta(seconds=0)
    return jsonify({'msg''세션이 종료 되었습니다!'})
cs

 

데스노트 조작으로 없애버림

 

찾아보니 킹택갓버플로우에도 session.permanent와 app.permanent_session_lifetime을 전역으로 사용하지 않고 쿼리마다 사용하라고 응답해주는 글이 있더라

 

흠터레스팅

왜 되는건지 모르겠네

 

 

 

setInterval(n밀리초마다반복할함수, n밀리초)

 

- 반복할 함수를 인자에 넣을 때는 ()를 붙이면 안된다

- 1초마다 반복하고 싶으면 두번째 인자에 1000을 넣자

- 임시함수를 사용해도 된다

 

clearInterval()

 

-반복을 멈출 때 쓴다

ex)

let 셋인터벌 = setInterval(repeatFn, 1000)

clearInterval(셋인터벌)

 

 

 

setTimeout(n밀리초후실행할함수, n밀리초)

 

-n밀리초 후 딱 한번 실행하고 종료한다.

-setInterval과 setTimeout 등 중복해서 사용할 수 있지만 지역스코프와 함수실행 절차를 잘 생각하면서 써야한다

 

 

clearTimeout()

 

-clearInterval과 사용법 같음

'Development > JavaScript' 카테고리의 다른 글

회원가입 유효성 검사 (signup validation)  (0) 2022.08.21
Ajax 익히기  (0) 2022.07.21

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 
    if (user_id === "") {
        $('#member_id').focus()
        return alert("아이디를 입력하세요")
    }
    if(user_pw === ""){
        $('#member_pw').focus()
        return alert("비밀번호를 입력하세요")
    }
    if (user_pw !== pw_confirm) {
        $('#member_pw_').val('')
        $('#member_pw_').focus()
        return alert("비밀번호가 다릅니다")
    }
    let pwdCheck = /^(?=.*[a-zA-Z])(?=.*[!@#$%^*+=-])(?=.*\d).{8,25}$/;
    if (!pwdCheck.test(user_pw)) {
        $('#member_pw').val('')
        $('#member_pw_').val('')
        $('#member_pw').focus()
        return alert("비밀번호는 영문자+숫자+특수문자 조합으로 8~25자리 사용해야 합니다")
    }
    if (user_name === ""){
        $('#member_name').focus()
        return alert("이름을 입력하세요")
    }
    if (user_nickname === ""){
        $('#member_nickname').focus()
        return alert("닉네임을 입력하세요")
    }
    if (user_email === ""){
        $('#member_email').focus()
        return alert("이메일을 입력하세요")
    }
    let emailCheck = /^\D\w*@\D\w*.(org|net|com)$/;
    if (!emailCheck.test(user_email)) {
        $('#member_email').val('')
        $('#member_email').focus()
        return alert("올바른 이메일 형식을 사용해주세요")
    }
    if (user_phone === ""){
        $('#member_phone').focus()
        return alert("핸드폰 번호를 입력하세요")
    }
    let phoneCheck = /^01[016-9]-\d{3,4}-\d{4}$/;
    if (!phoneCheck.test(user_phone)) {
        $('#member_phone').val('')
        $('#member_phone').focus()
        return alert("올바른 번호 형식을 사용해주세요")
    }
 
cs

 

'Development > JavaScript' 카테고리의 다른 글

setTimeout, setInterval  (0) 2022.08.21
Ajax 익히기  (0) 2022.07.21

 

리스트(목록)용


최신 내림차순 게시글 리스트
"select * from ("
+ "select rownum NUM, N.* "
+ "from (select * from notice where "+field+" like ? order by regdate desc) N "
+ ") "
+ "where NUM between ? and ?";

게시글 수 가져오기
"select COUNT(ID) COUNT from ("
+ "select rownum NUM, N.* from (select * from notice where "+field+" like ? order by regdate desc) N "
+ ")";

 

게시글(내부)용


다음 게시글 가져오기
"select * from notice where id = ( "
+ "select id from notice where regdate > "
+ "(select regdate from notice where id=?)"
+ " and rownum=1 "
+ ")";

이전 게시글 가져오기
"select * from notice where id = ("
+ " select * from (select * from notice order by regdate desc)"
+ " where regdate < (select regdate from notice where id=?) and rownum=1"
+ " )";

 

 

게시글 목록 테이블 SQL과 댓글 테이블 SQL 합치기


집계함수(count) 등에 해당되는 select 주체에는 테이블.* 같은 *은 쓸 수 없다.

DB의 데이터 타입 중 CONTENT 등에 사용되는 CLOB 데이터 타입의 경우 몇 GB 까지 들어가는 데이터형이므로 JOIN 문장에서는 사용할 수 없다.
(JOIN해서 사용할 일이 집계가 대부분이므로 굳이 그렇게 모든 field를 가져올 필요도 없다)
(사용하려면 variable 캐릭터 형식으로 형변환 후 사용할 수 있으나 4000자 내로 잘리게 된다)
(잘리지 않게 하려면 개별적으로 요청한다)


위 내용을 토대로 게시글(notice) 목록 마다 댓글(comment) 수 집계해서 가져오기

select N.id, N.title, N.writer_id, N.regdate, N.hit, N.files, count(C.id) CMT_COUNT
from notice N
left join "COMMENT" C on N.id = C.notice_id
group by N.id, N.title, N.writer_id, N.regdate, N.hit, N.files
order by N.regdate desc;


기존에 게시글 목록 가져오던 SQL

select * from (
select rownum NUM, N.* 
from (select * from NOTICE where "+field+" like ? order by regdate desc) N 

where NUM between ? and ?;


둘을 합쳐야 한다 (굵게 표시된 곳에 넣어야 한다)


1) 댓글 집계수 컬럼 join한 테이블에서 order by절을 빼고 view로 만든다 
(view는 컬럼 추가정도만. 필터나 정렬은 빼는게 써먹기 좋음)

create view NOTICE_VIEW
as
select N.id, N.title, N.writer_id, N.regdate, N.hit, N.files, count(C.id) CMT_COUNT
from notice N
left join "COMMENT" C on N.id = C.notice_id
group by N.id, N.title, N.writer_id, N.regdate, N.hit, N.files
--order by N.regdate desc;


2) 리스트를 뽑을 때 가장 기준이 되는 테이블에 넣는다
select * from (
select rownum NUM, N.* 
from (select * from NOTICE_VIEW where "+field+" like ? order by regdate desc) N 

where NUM between ? and ?;


3) 기존에 만들어둔 서비스클래스로 가서 쿼리를 NOTICE_VIEW로만 고쳐주면 적용된다

 


4) 추가로 만든 notice_view 테이블에 관련된 서비스는 새로이 notice_view 테이블용 entity class를 따로 만들어 superclass로 notice를 상속받아 사용한다
(content는 db 데이터타입 문제로 지웠으니 빈문자열로 기본값을 넣어 사용)
(어차피 게시글 리스트에는 본문이 보이지 않는다. 필요한 것만 구현하자)
(기존 list 서비스용 객체 생성 notice_view로 전부 바꾸고 새로운 entity import)


'Development > Java' 카테고리의 다른 글

파일 등록과 사용 #11  (0) 2022.08.22
Servlet / Jsp admin page #10  (0) 2022.08.22
JSTL #8  (0) 2022.08.15
JSP, EL 보충 #7  (0) 2022.08.15
JSP EL(Expression Language) #6  (0) 2022.08.14

오늘 배운 것 :

 

servlet, jsp, tomcat, oracleDb로 게시판 페이징, 검색 기능 구현

 

 

느낀 점:

 

조건처리 빡세네

 

 

아쉬웠던 점:

 

조건처리 너무 빡센데

'TIL' 카테고리의 다른 글

#16  (0) 2022.08.23
#15  (0) 2022.08.22
#13  (0) 2022.08.19
#12  (0) 2022.08.17
#11  (0) 2022.08.15

오늘 배운 것 :

 

flask session 기능, JPA, CI/CD 개념

js setintervel setimeout 사용하여 입출력부 session 제어 , flask.jinja2 (render_template) 라이브러리 활용

 

 

느낀 점:

 

java가 더 재미쒀

 

 

아쉬웠던 점:

 

파이썬을 보면 자바 문법을 까먹고 자바를 보면 자바스크립트 문법을 까먹고 자바스크립트를 보면 파이썬이랑 자바를 까먹음

 

 

'TIL' 카테고리의 다른 글

#15  (0) 2022.08.22
#14  (0) 2022.08.20
#12  (0) 2022.08.17
#11  (0) 2022.08.15
#10  (0) 2022.08.14

오늘 배운 것 :

 

MVC model Controller 경량화, 기업형 분리 Service 클레스 메소드 구현,

Flask, MongoDb로 Html과 python 서버간 ajax 데이터 교환을 위한 SQL 작성 

 

 

느낀 점:

 

nonSQL 은근 불편함. 버전업이 빨라서 그런가...

메소드 사용법이 블로그마다 달라서 공식페이지 구글번역기로 꾸역꾸역 돌려서 해결함

 

 

아쉬웠던 점:

 

SQL만 보면 머리가 백지가 됨

 

 

'TIL' 카테고리의 다른 글

#14  (0) 2022.08.20
#13  (0) 2022.08.19
#11  (0) 2022.08.15
#10  (0) 2022.08.14
#9  (0) 2022.08.13

 

KISS

 

Keep It Simple Stupid !

 

단순하게 만들어라

 

 

YAGNI

 

You Ain't Gonna Need It

 

필요한 작업만 해라

 

 

DRY

 

Do not Repeat Yourself

 

반복하지 마라

+ Recent posts