安装django
命令行安装django
pip3 install django==1.11.9
或者通过pycharm安装
创建django项目
命令行创建django项目
django-admin startproject **
pycharm创建django项目
目录介绍
mysite/
├── manage.py # 管理文件
└── mysite # 项目目录
├── __init__.py
├── settings.py # 配置
├── urls.py # 路由 --> URL和函数的对应关系
└── wsgi.py # runserver命令就使用wsgiref模块做简单的web server
运行Django项目
通过命令行创建
python manage.py runserver
*命令行创建django项目*
实现简单的交互
HttpResponse
内部传入一个字符串参数,返回给浏览器
def index(request):
# 业务逻辑代码
return HttpResponse("OK")
在urls.py中添加如下代码:
from django.conf.urls import url
from django.contrib import admin
from django.shortcuts import HttpResponse
def index(request):
return HttpResponse("hello sddjango")
urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'index/',index),
]
实现渲染输出
除request参数外还接受一个待渲染的模板文件和一个保存具体数据的字典参数。
将数据填充进模板文件,最后把结果返回给浏览器。(类似于我们上面用到的jinja2)
看下项目目录结构
在settings.py中
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
TEMPLATES文件夹是存放模板的路径
看下项目中的模板index.html代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>index</title>
<link rel="stylesheet" href="/static/mystyle.css">
</head>
<body>
<form action="/index/" method="post">
<p>姓名<input type="text" name="username"></p>
<p>密码<input type="password" name="password"></p>
<p><input type="submit" value="登录"></p>
<p style="color: red">{{ key }}</p>
</form>
</body>
</html>
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "mystatic"), # 静态文件存放位置
]
这里是配置静态文件的,比如js文件、css文件等
我们看下我们项目中的mystyle.css
form {
border: 1px solid green;
}
我们看下urls.py代码:
from django.conf.urls import url
from django.contrib import admin
from django.shortcuts import HttpResponse, render, redirect
def index(request): # 所有跟请求相关的数据,都保存在request
# 判断请求的类型是什么
print("--->:", request)
error_msg = ""
if request.method == "POST":
# 拿到form表单提交过来的数据
name = request.POST.get("username")
pwd = request.POST.get("password")
print(request.POST)
print(name, pwd)
# 拿到用户提交的数据去数据库里面检索,能找到就表示登录成功,否则登录失败
if name == "wyf" and pwd =="123456":
return redirect("https://www.sogo.com")
else:
error_msg = "用户名密码错误"
# return HttpResponse("<h1>hello world!</h1>")
return render(request, "index.html", {"key": error_msg})
urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'index/',index),
]
接下来进行测试
创建app
do命令行创建如下:
pycharm创建方式如下:
配置log日志
# 定义一下log文件存放的位置
BASE_LOG_DIR = os.path.join(BASE_DIR, "log")
# Django项目日志配置
LOGGING = {
# 固定搭配的一个版本号
'version': 1,
# 禁用已经存在的logger实例
'disable_existing_loggers': False,
# 定义了三个日志打印或保存的格式
'formatters': {
# 标准的
'standard': {
'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'
'[%(levelname)s][%(message)s]'
},
# 简单的格式
'simple': {
'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
},
# 收集
'collect': {
'format': '[%(asctime)s]%(message)s'
}
},
# 日志的过滤条件
'filters': {
# 需要debug=True
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
# 定义几个处理日志的方法
'handlers': {
# 把日志都打印到终端窗口
'console': {
'level': 'DEBUG',
'filters': ['require_debug_true'], # 只有在Django debug为True时才在屏幕打印日志
'class': 'logging.StreamHandler',
'formatter': 'simple'
},
# 默认
'default': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
'filename': os.path.join(BASE_LOG_DIR, "s8_info.log"), # 日志文件
'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
'backupCount': 5, # 日志文件个数
'formatter': 'standard',
'encoding': 'utf-8',
},
# 专门记录错误日志的
'error': {
'level': 'ERROR',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
'filename': os.path.join(BASE_LOG_DIR, "s8_err.log"), # 日志文件
'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
'backupCount': 5,
'formatter': 'standard',
'encoding': 'utf-8',
},
'collect': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
'filename': os.path.join(BASE_LOG_DIR, "s8_collect.log"),
'maxBytes': 1024 * 1024 * 50, # 日志大小 50M
'backupCount': 5,
'formatter': 'collect',
'encoding': "utf-8"
}
},
# 最后处理logger实例的配置
'loggers': {
# 默认的logger应用如下配置
'': {
'handlers': ['default', 'console', 'error'], # 上线之后可以把'console'移除
'level': 'DEBUG',
},
# 名为 'collect'的logger还单独处理
'collect': {
'handlers': ['console', 'collect'],
'level': 'INFO',
},
'collect.son': {
'handlers': ['console',],
'level': 'INFO',
'propagate': False,
}
},
}