静态文件的配置settings.py文件末尾添加静态文件路径css
#静态文件引用别名 STATIC_URL = '/static/' # 静态文件存放位置 STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static1'), os.path.join(BASE_DIR, 'static'), os.path.join(BASE_DIR, 'static2'), ] HTML文件使用事例: <link rel="stylesheet" href="/static/css/login.css">
在静态文件目录下应该建立css,js,img等目录,专门存放对应的静态,若是应用就加上别名+静态文件目录+文件名
刚开始学习时可在配置文件中暂时禁用csrf中间件,方便表单提交测试html
# 中间件相关的配置 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', ]
urls.py文件中(不规范,应该写在app的views.py文件中)前端
from django.shortcuts import HttpResponse,render,redirect def login(request): error_msg='' #须要判断 if request.method == 'POST': #第二次来,表示填写完了要给我发送数据了 --> POST u = request.POST.get('user') p = request.POST.get('pwd') print(u, p) if u == '123@qq.com' and p == '1234': # 登录成功则跳转到baidu # return redirect('http://www.baidu.com') return redirect('/index/') else: # 登录失败 # 提示用户名或密码错误 # pass error_msg ='用户名或密码错误' # 第一次来,是跟我要一个登录页面用来填写数据的 --> GET return render(request, 'login.html',{'error_msg': error_msg}) def test(request): #拿到用户发送过来的数据 print(request.POST) # request.POST['user'] # u = request.POST.get('user') # p = request.POST.get('pwd') # print(u,p) # if u == '123@qq.com' and p =='1234': # #登录成功 # # return redirect('http://www.baidu.com') # return redirect('/index/') # # else: # #登录失败 # #提示用户名或密码错误 # pass return HttpResponse('能够') def index(request): return render(request, 'index.html') urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', login), url(r'^test/', test), url(r'^index/', index), ] form表单提交数据的三个要素 1.from标签必需要有action和method属性 2.全部获取用户输入的标签必须放在from表单中,必需要有name属性 3.必需要有submit按钮 from django.shortcuts import HttpResponse,render,redirect 1.HttpResponse 返回一个指定字符串时 2.render 返回一个HTML文件 3.redirect 跳转 request相关的属性 request.method --> 返回的是请求的方法(全大写GET/POST) request.GET --> 取的是URL里边的参数,相似于字典的数据结构 request.POST --> post提交的数据
Django的MTV模式(下降各个部分之间的耦合性)python
Model(模型):负责业务对象与数据库的对象(ORM)
Template(模版):负责如何把页面展现给用户
View(视图):负责业务逻辑,并在适当的时候调用Model和Template
Django还有一个urls分发器,它的做用是将一个个URL的页面请求分发给不一样的view处理,view再调用相应的Model和Template
Django框架图示mysql
APP(至关于文件夹)
一个Django项目能够分为不少个APP,用来隔离不一样功能模块的代码
cmd项目根目录命令行建立
python manage.py startapp app01
使用PyCharm建立ios
注册(建立完APP必须注册,不然不能用)sql
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', #找到建立的app目录中的apps.py文件里的App01Config 'app01.apps.App01Config' ]
把urls.py文件中的函数及导入的模块写在views.py文件中(规范写法)数据库
urls.py from django.conf.urls import url from django.contrib import admin #把app中的views文件单过模块导入到urls文件中 from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', views.login), url(r'^test/', views.test), url(r'^index/', views.index), ] app中的views.py文件中写函数 from django.shortcuts import HttpResponse,render,redirect
# Create your views here. def login(request): error_msg='' #须要判断 if request.method == 'POST': #第二次来,表示填写完了要给我发送数据了 --> POST u = request.POST.get('user') p = request.POST.get('pwd') print(u, p) if u == '123@qq.com' and p == '1234': # 登录成功 # return redirect('http://www.baidu.com') return redirect('/index/') else: # 登录失败 # 提示用户名或密码错误 # pass error_msg ='用户名或密码错误' # 第一次来,是跟我要一个登录页面用来填写数据的 --> GET return render(request, 'login.html',{'error_msg': error_msg}) def test(request): #拿到用户发送过来的数据 print(request.POST) # request.POST['user'] # u = request.POST.get('user') # p = request.POST.get('pwd') # print(u,p) # if u == '123@qq.com' and p =='1234': # #登录成功 # # return redirect('http://www.baidu.com') # return redirect('/index/') # # else: # #登录失败 # #提示用户名或密码错误 # pass return HttpResponse('能够') def index(request): return render(request, 'index.html')
ORMnpm
ORM DB
类 表
属性 字段
对象 数据行
#ORM链接数据库必须在app中的views.py文件中导入此模块 from app01 import models 1. 建立一个mysql数据库 2. 在settings中进行数据库的配置: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', # 引擎 'NAME': 'django_day53', # 名称 'HOST': '127.0.0.1', # IP地址 'PORT': 3306, # 端口 'USER': 'root', # 用户名 'PASSWORD': '123' # 密码 } } 3. 告诉Django使用pymysql模块链接mysql数据库 在与settings同级目录下的__init__中写: import pymysql pymysql.install_as_MySQLdb() 4. 在app下的models.py中写类(表): class User(models.Model): username = models.CharField(max_length=32) # varchar(32) password = models.CharField(max_length=32) 5. 在Terminal窗口执行数据库迁移的命令: python manage.py makemigrations # 保存models.py的变动记录 python manage.py migrate # 将变动记录同步到数据库中 6.ORM操做 在app中的views.py文件中 def orm_test(request): #方法一 # 全部数据 对象列表 ret = models.User.objects.all() for i in ret: print(i, type(i)) print(i.username, i.password) #方法二 # 获取一个知足条件的对象 没有数据 或者 多条数据就报错 ret = models.User.objects.get(username='alex') #方法三 # 获取知足条件的全部对象 ret = models.User.objects.filter(username='alex1', password='alexdsb') print(ret, type(ret))
pycharm链接mysql数据库django
在views.py中定义函数orm_test,
def orm_test(request):
ret = models.User.objects.filter(user='bob', pwd='1234')
print(ret, type(ret))
return HttpResponse('ok')
而后再urls.py中定义url
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^login/', views.login),
url(r'^test/', views.test),
url(r'^index/', views.index),
url(r'^orm_test/', views.orm_test),
而后启动django项目访问/orm_test/便可看到django打印的日志
修改views.py文件,让其验证数据库中的用户密码
from django.shortcuts import HttpResponse,render,redirect #导入链接数据库的模块 from app01 import models # Create your views here. def login(request): error_msg='' #须要判断 if request.method == 'POST': #第二次来,表示填写完了要给我发送数据了 --> POST u = request.POST.get('user') p = request.POST.get('pwd') print(u, p) # if u == '123@qq.com' and p == '1234': #判断数据库中查询的用户名密码与前端用户提交的用户名密码是否一致 if models.User.objects.filter(user=u,pwd=p): # 登录成功 # return redirect('http://www.baidu.com') return redirect('/index/') else: # 登录失败 # 提示用户名或密码错误 # pass error_msg ='用户名或密码错误' # 第一次来,是跟我要一个登录页面用来填写数据的 --> GET return render(request, 'login.html',{'error_msg': error_msg}) def test(request): #拿到用户发送过来的数据 print(request.POST) # request.POST['user'] # u = request.POST.get('user') # p = request.POST.get('pwd') # print(u,p) # if u == '123@qq.com' and p =='1234': # #登录成功 # # return redirect('http://www.baidu.com') # return redirect('/index/') # # else: # #登录失败 # #提示用户名或密码错误 # pass return HttpResponse('能够') def index(request): return render(request, 'index.html') def orm_test(request): ret = models.User.objects.filter(user='bob', pwd='1234') print(ret, type(ret)) return HttpResponse('ok') 启动django访问/ligon/
一个django链接数据库验证用户名密码的案例
1.用pycharm建立项目pyproject 2.在cmd中建立app python manage.py startapp app01 3.在cmd中建立数据库pymysql 4.把登录页面和登录后的页面放到django项目中templates文件夹中 登录页面login.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>后台管理系统</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> </head> <body> <div class="container"> <div class="panel panel-primary"> <div class="panel-heading"> <h3 class="panel-title">登录页面<span class="glyphicon glyphicon-pushpin col-md-offset-11" aria-hidden="true"></span></h3> </div> <div class="panel-body"> {# action当提交表单时,表单数据会提交到名为/login/的页面,提交模式为post#} <form class="form-horizontal" action="/login/" method="post"> <div class="form-group"> <label for="inputEmail3" class="col-sm-2 control-label">用户名</label> <div class="col-sm-10"> {#name属性用于对提交到服务器后的表单数据进行标识,只有设置了name属性的表单元素才能在提交表单时传递它们的值#} <input type="text" name='user' class="form-control" id="inputEmail3" placeholder="User"> </div> </div> <div class="form-group"> <label for="inputPassword3" class="col-sm-2 control-label">密码</label> <div class="col-sm-10"> <input type="password" name='pwd' class="form-control" id="inputPassword3" placeholder="Password"> </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> <div class="checkbox"> <label> <input type="checkbox"> Remember me </label> </div> </div> </div> <div class="form-group"> <div class="col-sm-offset-2 col-sm-10"> {# submit提交按钮#} <button type="submit" class="btn btn-default">Sign in</button> <P style="color: red;text-align: center">{{ error_msg }}</P> </div> </div> </form> </div> </div> </div> </body> </html> 登录成功后显示的页面index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> </head> <body> <div class="container"> <h2>信息收集卡</h2> <div class="progress"> <div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="30" aria-valuemin="0" aria-valuemax="100" style="width: 30%;"> 1/3 </div> </div> <div class="panel panel-primary"> <div class="panel-heading"> <h3 class="panel-title">基本信息<span class="glyphicon glyphicon-pushpin col-md-offset-11" aria-hidden="true"></span></h3> </div> <div class="panel-body"> <form class="form-horizontal"> <div class="form-group"> <label for="inputEmail3" class="col-sm-2 control-label">姓名</label> <div class="col-sm-10"> <input type="email" class="form-control" id="inputEmail3" placeholder="姓名"> </div> </div> <div class="form-group"> <label for="inputPassword4" class="col-sm-2 control-label">手机</label> <div class="col-sm-10"> <input type="text" class="form-control" id="inputPassword4" placeholder="手机"> </div> </div> <div class="form-group"> <label for="inputPassword5" class="col-sm-2 control-label">邮箱</label> <div class="col-sm-10"> <input type="text" class="form-control" id="inputPassword5" placeholder="邮箱"> </div> </div> <div class="form-group"> <label for="inputPassword6" class="col-sm-2 control-label">密码</label> <div class="col-sm-10"> <input type="password" class="form-control" id="inputPassword6" placeholder="密码"> </div> </div> <div class="form-group"> <label class="col-sm-2 control-label">头像</label> <div class="col-sm-10"> <input type="file" id="exampleInputFile"> <p class="help-block">只支持png/jpg/gif格式.</p> </div> <div class="form-group"> <label for="inputPassword6" class="col-sm-2 control-label">属性</label> <div class="col-sm-10"> <div class="radio"> <label> <input type="radio" name="optionsRadios" id="optionsRadios1" value="option1"> 我是一个好人 </label> </div> <div class="radio"> <label> <input type="radio" name="optionsRadios" id="optionsRadios2" value="option2"> 我是一个坏人 </label> </div> <div class="radio" disabled> <label> <input type="radio" name="optionsRadios" id="optionsRadios3" value="option3" disabled> 我是一个真人 </label> </div> </div> </div> </div> </form> </div> </div> <p class="text-right"> <button type="button" class="btn btn-success">下一步</button> </p> </div> </body> </html> 5.django修改中的文件 settings.py文件 # Application definition INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', #注册app 'app01.apps.App01Config' ] # 中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', # 刚开始学习时可在配置文件中暂时禁用csrf中间件,方便表单提交测试 # 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = 'pyproject.urls' 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', ], }, }, ] WSGI_APPLICATION = 'pyproject.wsgi.application' # Database # https://docs.djangoproject.com/en/1.11/ref/settings/#databases #链接数据库的配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'pymysql', 'HOST': '127.0.0.1', 'PORT': 3306, 'USER': 'root', 'PASSWORD': '123.com' } } 修改urls.py文件 from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', views.login), url(r'^index/', views.index), url(r'^orm/', views.orm_test), ] 修改__init__.py #导入pymysql模块让django链接mysql import pymysql pymysql.install_as_MySQLdb() 修改models.py from django.db import models # Create your models here. #使用orm建立数据库userinfo表及设置表结构 class Userinfo(models.Model): user = models.CharField(max_length=32) pwd = models.CharField(max_length=32) 修改views.py from django.shortcuts import HttpResponse,render,redirect from app01 import models def login(request): error_msg='' if request.method == 'POST': u = request.POST.get('user') p = request.POST.get('pwd') print(u, p) #获取指定数据库表的数据 if models.Userinfo.objects.filter(user=u,pwd=p): return redirect('/index/') else: error_msg ='用户名或密码错误' return render(request, 'login.html',{'error_msg': error_msg}) def index(request): return render(request, 'index.html') def orm_test(request): ret = models.Userinfo.objects.filter(user='bob', pwd='1234') print(ret, type(ret)) return HttpResponse('ok') 6.在pycharm的Terminal中执行 #保存models.py的变动记录 python manage.py makemigrations #将变动记录同步到数据库中 python manage.py migrate 7.在pycharm中链接mysql数据库,并插入测试的用户名密码数据 8.启动django,页面访问 127.0.0.1:8000/login/ 127.0.0.1:8000/orm/