安装
- pip3 install django
- Python35\Scripts目录添加至环境变量
命令行操作
-
创建django工程: django-admin.exe startproject mysite(工程名)
-
cd mysite
-
运行服务端,默认端口8000: python manage.py runserver
-
指定端口,运行服务器: python manage.py runserver 127.0.0.1:8001
-
创建app: python manage.py startapp cmdb(app名)
-
创建数据库表结构:
python manage.py makemigrations
python manage.py migrate
-
创建管理员用户及密码(Django自带的后台管理):
python manage.py createsuperuser
目录
mysite
mysite 对整个程序进行配置
init.py 包
settings.py 配置文件,例如连接数据库、支持静态文件、支持缓存、支持模板
urls.py URL对应关系
wsgi.py 遵循WSIG规则,一套接口规则,即调用别人实现的socket,上线用uwsgi + nginx
manage.py 管理Django程序
app
migrations 记录数据库的修改表结构操作
admin.py Django提供的后台管理
apps.py 配置当前app
models.py ORM,写指定的类,通过命令可创建数据库表结构
tests.py 单元测试
views.py 业务代码
db.sqlite3 数据库
pycharm操作
- 创建django工程: File -> New Project -> Django -> 输入工程路径和工程名 -> Create
- 运行服务端,默认IP 127.0.0.1, 默认端口8000: 点击工程名边上的运行按钮
- 修改服务端运行配置参数: 点击工程名上的向下按钮,选择Edit Configurations
- 修改pycharm根目录: File -> Settings -> Project:xxx -> Project Structure -> 设置 -> Apply -> OK
工程配置
配置模板路径(templates)
工程中的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‘,
],
},
},
]
配置静态目录(static)
工程中的settings.py
STATIC_URL = ‘/static/‘
STATICFILES_DIRS = (
os.path.join(BASE_DIR, ‘static‘),
)
注册app(数据库配置)
工程中的settings.py
INSTALLED_APPS中添加app命令,例如
INSTALLED_APPS = [
‘django.contrib.admin‘,
‘django.contrib.auth‘,
‘django.contrib.contenttypes‘,
‘django.contrib.sessions‘,
‘django.contrib.messages‘,
‘django.contrib.staticfiles‘,
‘app01‘,
]
根据情况配置使用数据库(可选)
默认数据库(无需修改)
DATABASES = {
‘default‘: {
‘ENGINE‘: ‘django.db.backends.sqlite3‘,
‘NAME‘: os.path.join(BASE_DIR, ‘db.sqlite3‘),
}
}
修改数据库方式,数据名(dbname)需要自己创建
DATABASES = {
‘default‘: {
‘ENGINE‘: ‘django.db.backends.mysql‘,
‘NAME‘:‘dbname‘,
‘USER‘: ‘root‘,
‘PASSWORD‘: ‘xxx‘,
‘HOST‘: ‘‘,
‘PORT‘: ‘‘,
}
}
注:Django默认使用MySQLdb模块连接mysql数据库,但python 3.x中无该模块
需要改为pymysql:在project同名文件夹下的__init__.py文件中添加代码如下:
import pymysql
pymysql.install_as_MySQLdb()
html文件中,关联静态文件
静态文件包括CSS, javascript, Images
关联css
在html头部,添加
<link rel="stylesheet" href="/static/commons.css"/>
关联js
在html的body的最后,添加
<script src="/static/commons.js"></script>
函数功能示例
HttpResponse("字符串")
from django.shortcuts import HttpResponse
def home(request):
# return ["<h1>Hello, date!</h1>".encode("utf-8"), ]
return HttpResponse(‘<h1>CMDB<h1>‘)
render(request, "HTML模板的路径")
from django.shortcuts import render
def login(request):
# request中包含用户提交的所有信息
# request.method 获取用户提交方式
# f = open(‘templates/login.html‘, ‘r‘, encoding=‘utf-8‘)
# data = f.read()
# f.close()
# return HttpResponse(data)
return render(request, ‘login.html‘)
redirect("/只能填URL的路径")
以GET方式获取的数据
from django.shortcuts import redirect
from django.shortcuts import render
from django.shortcuts import redirect
def login(request):
"""
:param request: 包含用户提交的所有信息
"""
error_message = ""
# request.method 获取用户提交方式
if request.method == "POST":
user = request.POST.get(‘user‘, None)
pwd = request.POST.get(‘pwd‘, None)
if user == ‘root‘ and pwd == ‘123‘:
return redirect("http://www.baidu.com")
else:
error_message = "用户名或密码错误"
return render(request, ‘login.html‘, {‘error_message‘: error_message})
常见问题
TemplateDoesNotExist
问题:若客户端访问服务器,出现TemplateDoesNotExist
方法:检查工程settings.py中,TEMPLATES列表的DIRS字典,是否是
os.path.join(BASE_DIR, ‘templates‘)
获取静态文件失败(404)
按照“工程配置”中的“配置静态目录”,进行配置
定位思路
web页面 -》 右键 -》 审查元素 -》 Network -> 点击文件名 -》 Headers -> Request URL(http请求)
客户端报CSRF(跨站请求伪造)
settings.py中注释掉crsf
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‘,
]
RuntimeError(post方法提交数据)
You called this URL via POST, but the URL doesn‘t end in a slash and you have APPEND_SLASH set.
Django can‘t redirect to the slash URL while maintaining POST data.
Change your form to point to 127.0.0.1:8000/login/
(note the trailing slash), or set APPEND_SLASH=False in your Django settings.
解释:该情况仅在Django出现,原因是Django,无‘/’, 会自动添加‘/‘
原因:urls.py中的URL对照关系的检索对象与form表单中action的内容不对应
方法:保证两种一致,后面都有‘/’,或都没有‘/’, 再重启工程,即可修复
例如:
urlpatterns = [
url(r‘^admin/‘, admin.site.urls),
url(r‘^login‘, views.login),
]
<form action="/login" method="post">
或者
urlpatterns = [
url(r‘^admin/‘, admin.site.urls),
url(r‘^login/‘, views.login),
]
<form action="/login/" method="post">
SyntaxError: (unicode error)
SyntaxError: (unicode error) ‘utf-8‘ codec can‘t decode byte 0xd3 in position 0:
invalid continuation byte
原因:工程文件编码问题,非utf-8,不识别汉字
解决方法:将工程文件编码格式,修改为utf-8,再重新打开工程
File -> Settings -> Editor -> File encodings
编写完数据库结构,执行命令makemigrations,提示No changes detected
原因: 工程中的settings.py中,无注册app
解决方法:
工程中的settings.py
INSTALLED_APPS = [
‘django.contrib.admin‘,
‘django.contrib.auth‘,
‘django.contrib.contenttypes‘,
‘django.contrib.sessions‘,
‘django.contrib.messages‘,
‘django.contrib.staticfiles‘,
‘app01‘,
]