django项目实际工作中的配置以及一些有用的小工具(持续更新)
常用pycharm快捷键: https://www.cnblogs.com/luolizhi/p/5610123.html
Ctrl + F1 显示错误
Ctrl + Alt + Space 快速导入任意类
Ctrl + / 行注释/取消行注释
Ctrl + Shift + / 块注释
Ctrl + Alt + I 自动缩进
Ctrl + P 参数信息(在方法中调用参数)
Ctrl + D 复制选定的区域或行
Ctrl + Y 删除选定的行
2、查找/替换(Search/Replace)
F3 下一个
Shift + F3 前一个
Ctrl + R 替换
Ctrl + Shift + F 全局查找{可以在整个项目中查找某个字符串什么的,如查找某个函数名字符串看之前是怎么使用这个函数的}
F3 下一个
Shift + F3 前一个
Ctrl + R 替换
Ctrl + Shift + F 全局查找{可以在整个项目中查找某个字符串什么的,如查找某个函数名字符串看之前是怎么使用这个函数的}
Ctrl + Shift + R 全局替换
1.form模块
1.1利用 form模块进行验证,可以将定义的类 forms.py里面的字段与数据库的验证的设置为一致(例如定义 LogForm类),在进行数据库查询时可以直接传入字典。
form=LogForm(request.POST) # 实例化 LogForm
form = RegForm(request.POST) # 实例化 LogForm
models.Article.objects.fifter(username=form.get["username"], password=form.get["password"])
models.Article.objects.fifter(**form) # 这样在后期拓展字段是很方便,注意 form定义的类字段和数据库要一致
models.Article.objects.fifter(username=form.get["username"], password=form.get["password"])
models.Article.objects.fifter(**form) # 这样在后期拓展字段是很方便,注意 form定义的类字段和数据库要一致
1.2 form 模块下用内部的 fom.add_error 来自定义错误,如用户名密码在和数据库验证后,不通过,想显示在 password标签,则可写成:
form.add_error("password","用户名或密码错误")
1.3 利用md5方法对密码进行加密:
from django.test import TestCase
# Create your tests here.
import hashlib
def md5(text):
m=hashlib.md5()
m.update(text.encode("utf-8")) # 传入的字符串需转换成二进制
return m.hexdigest()
print(md5("AIF333")) # 07587025264c9a3bea45cd647f68e649
# Create your tests here.
import hashlib
def md5(text):
m=hashlib.md5()
m.update(text.encode("utf-8")) # 传入的字符串需转换成二进制
return m.hexdigest()
print(md5("AIF333")) # 07587025264c9a3bea45cd647f68e649
1.4 利用装饰器来进行页面的登录权限控制
def auth(func):
def inner(request,*args,**kwargs): # 由于用户认证有request,需加这个,其他的装饰器一般不需要
##########这里写执行前加的逻辑处理,校验数据库用户信息##########
## user=request.session.get(settings.USER_SESSION_KEY) ##
## if not user: ##
## return ##
##############################################################
response=func(request,*args,**kwargs)
##############################################################
## 这里写执行后加的逻辑处理 ##
##############################################################
return response
return inner
def inner(request,*args,**kwargs): # 由于用户认证有request,需加这个,其他的装饰器一般不需要
##########这里写执行前加的逻辑处理,校验数据库用户信息##########
## user=request.session.get(settings.USER_SESSION_KEY) ##
## if not user: ##
## return ##
##############################################################
response=func(request,*args,**kwargs)
##############################################################
## 这里写执行后加的逻辑处理 ##
##############################################################
return response
return inner
2. 在利用session进行用户登录认证时,可以自己定义一个key写入session,但是这个在实际中可能会经常取到,所以最好也放在配置文件里,一般在 settings下
例如 settings.py里 :配置文件必须大写,否则读不到
# 自定义的session_key
USER_SESSION_KEY="fafdkfjdl"
USER_SESSION_KEY="fafdkfjdl"
在别的模块引入settings时需注意,项目里用 django.conf导入,这个会更全
from django.conf import settings # 自定义的 + 整个django框架的其他配置
# from cnblog import settings # 仅仅 settings.py里的配置
3.django的生命周期&中间件
用户请求过来后,先经过中间键来到路由系统,分化到视图函数,经过ORM和模板一起渲染,从视图函数过路由系统经中间件返回到用户;
理解中间件:装饰器是对函数进行装饰的方法,粒度比较细,而中间件则是对整个项目的装饰。配置在settings.py里可以自定义:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
中间件的定义语法:http://www.cnblogs.com/wupeiqi/articles/5237704.html https://www.cnblogs.com/zhaof/p/6281541.html ;
其实有五个方法,最常用的是这两个,process_request可以有返回值,也可以没有,有的化就直接中间件原路返回,后面的例子,中间件实现登录验证
class M1(MiddlewareMixin):
def process_request(self,request):
print("中间件1请求")
def process_response(self,request,response): # 必须要有返回值
print("中间件1返回")
return response
def process_request(self,request):
print("中间件1请求")
def process_response(self,request,response): # 必须要有返回值
print("中间件1返回")
return response
中间件实现用户页面的校验,将不需要在每个视图函数里加装饰器(如果被中间件拦截了将不会再去走后面的路由,视图了,直接中间间向前返回给用户)例如:
class M1(MiddlewareMixin):
def process_request(self,request):
if request.path_info == "/login": #排除登录页面,否则会重定向过多,死循环;request.path_info是当前的登录路径
return None
user=request.session.get(settings.USER_SESSION_KEY) # 中间件实现页面访问控制,对除login页面的其他url都适用
if not user:
return redirect("/login")
def process_response(self,request,response): # 必须要有返回值
print("中间件1返回")
return response
def process_request(self,request):
if request.path_info == "/login": #排除登录页面,否则会重定向过多,死循环;request.path_info是当前的登录路径
return None
user=request.session.get(settings.USER_SESSION_KEY) # 中间件实现页面访问控制,对除login页面的其他url都适用
if not user:
return redirect("/login")
def process_response(self,request,response): # 必须要有返回值
print("中间件1返回")
return response
4.模板
关键字:extends block
注意实际项目中一般模板创建三个:注意 cs的文件引入在头,js的文件引入在尾
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
{% block css %}
{% endblock %}
</head>
<body>
{% block bodyhtml %}
{% endblock %}
{% block js %}
{% endblock %}
</body>
</html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
{% block css %}
{% endblock %}
</head>
<body>
{% block bodyhtml %}
{% endblock %}
{% block js %}
{% endblock %}
</body>
</html>
5.XSS攻击
通过评论或其他可输入地方,传入html代码(在里面植入破坏的js代码,如获取用户session,传入特定地方),用户在打开网页时会不知不觉的泄露自己的私密数据。
django默认是不将其他输入当做html渲染的,如果自己定义的需要打开:
1. 在模板中(html)用 |safe 模式
2. 在视图函数,后端处理,用mark_safe模块,这样就可以将html直接在模板渲染
from django.utils.safestring import mark_safe
html="""<a href="#">1</a>
<a href="#">2</a>
<a href="#">3</a>"""
safehtml=mark_safe(html)
html="""<a href="#">1</a>
<a href="#">2</a>
<a href="#">3</a>"""
safehtml=mark_safe(html)