Django web 基础
Posted 阿里山QQ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django web 基础相关的知识,希望对你有一定的参考价值。
一、Django概述
Django大而全;
创建Django工程:django-admin startproject sitename
创建django之后生成的目录结构如下:
Project
Project
settings
url
wsgi
web
model
views
test
admin
administrator
D:\\python_scripts\\s11day17_Django>python manage.py startapp app01 #创建app;一个app是一个完整的软件或者功能;
app下面的文件:
models:对数据库操作的;
views:函数放置的文件;
test:做测,忽略;
admin:Django的后台管理平台
http://127.0.0.1:8000/admin 访问Django的后台管理平台;
可以创建admin后台管理的账户,账户默认存在于数据库下,存放位置在settings中定义如下:
DATABASES = {
\'default\': {
\'ENGINE\': \'django.db.backends.sqlite3\',
\'NAME\': os.path.join(BASE_DIR, \'db.sqlite3\'),
}
}
下面写一个http请求,urls是路由系统:
from django.conf.urls import url,include from django.contrib import admin from app01 import views urlpatterns = [ url(r\'^admin/\', include(admin.site.urls)), url(r\'^home/\',views.home), #一个url对应一个函数,函数存在于app的views中 ]
views中的函数如下:
from django.shortcuts import render # Create your views here. from django.shortcuts import HttpResponse def home(request): #此处的request是必须的 return HttpResponse(\'ok\')
D:\\python_scripts\\s11day17_Django>python manage.py runserver 127.0.0.1:8009 #启动Django程序;或者在Django工程的edit下面配置端口http://127.0.0.1:8009/home/ #访问
-----http请求完毕;
Django模板渲染
在app的views中添加的函数返回html文件内容,如下:
#!/usr/bin/env python #coding:utf-8 from django.shortcuts import render # Create your views here. from django.shortcuts import HttpResponse def home(request): #return HttpResponse(\'ok\') \'\'\'render内部找到home.html,读取html返回给用户,render和跨站请求伪造相关\'\'\' return render(request,\'home.html\')
可以看到默认到templates模块下找该文件了;那么程序如何知道html文件时在templates下面去找的呢?事实上,是在settings配置文件下面设置的啦;不同版本的Django配置有所不同;
TEMPLATES = [
{
\'BACKEND\': \'django.template.backends.django.DjangoTemplates\',
\'DIRS\': [os.path.join(BASE_DIR, \'templates\')]
,
就OK拉~~~~~~~
Django内部也使用jinjia2模板:
views内容如下:
#!/usr/bin/env python #coding:utf-8 # Create your views here. from django.shortcuts import render from django.shortcuts import HttpResponse,render_to_response def home(request): #return HttpResponse #return render_to_response(request,\'home.html\') \'\'\'render内部找到home.html,读取html返回给用户\'\'\' dic ={\'name\':\'Charles\',\'age\':18} return render(request,\'home.html\',dic)
home.html文件如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>Home</h1> <h2>{{ name }}</h2> <h2>{{ age }}</h2> </body> </html>
模板渲染完毕
模板语言和自定义simple_tag
home.html模板语言:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>Home</h1> <h2>{{ name }}</h2> <h2>{{ age }}</h2> <ul> {% for item in user_list %} <li>{{ item }},{{ forloop.first }}</li> {% endfor %} </ul> </body> </html>
views内容如下:
#!/usr/bin/env python #coding:utf-8 # Create your views here. from django.shortcuts import render from django.shortcuts import HttpResponse,render_to_response def home(request): #return HttpResponse #return render_to_response(request,\'home.html\') \'\'\'render内部找到home.html,读取html返回给用户\'\'\' dic ={\'name\':\'Charles\',\'age\':18,\'user_list\':{\'Charles\',\'wahaha\',\'Rain\'}} return render(request,\'home.html\',dic)
尽管模板语言可以提供部分函数,实现一部分功能,但是有些需要我们自定义区实现:
1、在app中创建templatetags和文件
2、
3、
Django之母版:
什么叫做母版:红色部分在其他页面走不回改变,那么就没有必要再任何页面写这些内容啦~~~,可以创建母版实现啦,类似于类的继承
那么如何实现母版以及继承母版:
master下的m1为母版:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{% block title %}{% endblock %}</title> <style> .header{ height: 48px; background-color: red; } .body{ background-color: #dddddd; } .body .menu{ background-color: green; float: left; width: 2%; } .body .content{ background-color: darkgoldenrod; float: left; width: 70%; } </style> </head> <body> <div class="header">LOGO</div> <div class="body"> <div class="menu">左侧菜单</div> <div class="content"> {% block content %}{% endblock %} </div> </div> </body> </html>
son1继承m1:
{% extends "master/m1.html" %} {% block content %} <h1>666</h1> {% include "include/input_group.html" %} {% include "include/haha.html" %} {% endblock %} {% block title %} 老男人 {% endblock %}
son1同样继承include下的两个html文件内容;include防止在子html的什么位置,内容就显示在什么地方;
母版和include的应用场景:
母版:总体布局使用;include在局部功能上需要别的页面继承的时候使用:
views的内容:
#!/usr/bin/env python #coding:utf-8 # Create your views here. from django.shortcuts import render from django.shortcuts import HttpResponse,render_to_response def son(request): return render(request,\'son1.html\') def home(request): #return HttpResponse #return render_to_response(request,\'home.html\') \'\'\'render内部找到home.html,读取html返回给用户\'\'\' dic ={\'name\':\'Charles\',\'age\':18,\'user_list\':{\'Charles\',\'wahaha\',\'Rain\'}} return render(request,\'home.html\',dic)
urls的内容:
from django.conf.urls import url,include from django.contrib import admin from app01 import views urlpatterns = [ url(r\'^admin/\', include(admin.site.urls)), url(r\'^home/\',views.home), url(r\'^son/\',views.son), ]
Django静态文件的配置:
比如上面html母版中的CSs渲染的部分,需要放置到静态文件夹中,然后在母版中导入即可;
创建static静态文件夹
在settings中指明(需要一一对应)文件的路径
这样母版m1的内容就为:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{% block title %}{% endblock %}</title> <link rel="stylesheet" href="/static/css/commons.css"/> {% block css %}{% endblock %} #也可以设置css文件的母版 </head> <body> <div class="header">LOGO</div> <div class="body"> <div class="menu">左侧菜单</div> <div class="content"> {% block content %}{% endblock %} </div> </div> <script type="text/javascript"> </script> {% block js %}{% endblock %} #设置js文件的母版 </body> </html> commons.ss的内容为: .clearfix:after{ content: "."; visibility: hidden; display: block; height: 0; clear: both; } .header{ height: 48px; background-color: red; } .body{ background-color: #dddddd; } .body .menu{ background-color: green; float: left; width: 2%; } .body .content{ background-color: darkgoldenrod; float: left; width: 70%; }
settings的内容如下:
STATIC_URL = \'/static/\'
STATICFILES_DIRS=(
os.path.join(BASE_DIR,\'static\'),
)
整个程序访问流程如下:请求到url-->views-->templates中找html-->数据和html模板渲染-->得到字符串返回给用户
下面开发一个Django用户登录实例:
1、拷贝jQuery和bootstrap插件到静态文件目录下:
2、增加登录模块(html文件),增加表单的name
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{% block title %}{% endblock %}</title> <link rel="stylesheet" href="/static/css/commons.css"/> {% block css %}{% endblock %} #也可以设置css文件的母版 </head> <body> <div class="header">LOGO</div> <div class="body"> <div class="menu">左侧菜单</div> <div class="content"> {% block content %}{% endblock %} </div> </div> <script type="text/javascript"> </script> {% block js %}{% endblock %} #设置js文件的母版 </body> </html> commons.ss的内容为: .clearfix:after{ content: "."; visibility: hidden; display: block; height: 0; clear: both; } .header{ height: 48px; background-color: red; } .body{ background-color: #dddddd; } .body .menu{ background-color: green; float: left; width: 2%; } .body .content{ background-color: darkgoldenrod; float: left; width: 70%; }
3、views增加login函数
def login(request): #如果是get请求,get请求表示请求页面 #如果是POST,检验用户输入;POST表示向页面提交内容 print request.method if request.method == \'POST\': input_email=request.POST[\'email\'] input_pwd = request.POST[\'pwd\'] if input_email == \'Charles@qq.com\' and input_pwd == "123": from django.shortcuts import redirect return redirect("https://www.baidu.com") #跳转到别的页面,如果想要跳转到别的函数,比如son,return redirect("/son/") else: return render(request,\'login.html\',{\'status\':\'用户名或密码错误\'}) #否则显示错误 return render(request,\'login.html\')
4、urls的内容
from django.conf.urls import url,include from django.contrib import admin from app01 import views urlpatterns = [ url(r\'^admin/\', include(admin.site.urls)), url(r\'^home/\',views.home), url(r\'^son/\',views.son), url(r\'^login/\',views.login), ]
model基本操作之增删改查
Django提供了ORM,可以使用类来创建数据库表和字段:
命令python manage.py makemigations 和python manage.py migrate可以创建数据表,生成0001.initial.py文件(注意都是在app01中操作的)
2、settings内容:
INSTALLED_APPS = [
\'django.contrib.admin\',
\'django.contrib.auth\',
\'django.contrib.contenttypes\',
\'django.contrib.sessions\',
\'django.contrib.messages\',
\'django.contrib.staticfiles\',
\'app01\', #注册该app
]
3、urls内容
from django.conf.urls import url,include from django.contrib import admin from app01 import views urlpatterns = [ url(r\'^admin/\', include(admin.site.urls)), url(r\'^home/\',views.home), url(r\'^son/\',views.son), url(r\'^login/\',views.login), url(r\'^index/\',views.index), ]
4、views中定义index函数:
#!/usr/bin/env python #coding:utf-8 # Create your views here. from django.shortcuts import render from django.shortcuts import HttpResponse,render_to_response def son(request): return render(request,\'son1.html\') def home(request): #return HttpResponse #return render_to_response(request,\'home.html\') \'\'\'render内部找到home.html,读取html返回给用户\'\'\' dic ={\'name\':\'Charles\',\'age\':18,\'user_list\':{\'Charles\',\'wahaha\',\'Rain\'}} return render(request,\'home.html\',dic) def login(request): #如果是get请求 #如果是POST,检验用户输入 print request.method if request.method == \'POST\': input_email=request.POST[\'email\'] input_pwd = request.POST[\'pwd\'] if input_email == \'Charles@qq.com\' and input_pwd == "123": from django.shortcuts import redirect return redirect("/index/") else: return render(request,\'login.html\',{\'status\':\'用户名或密码错误\'}) return render(request,\'login.html\') def index(request): #数据库取数据 #数据和HTML渲染 from app01 import models if request.method =="POST": input_em = request.POST[\'em\'] input_pw = request.POST[\'pw\'] models.UserInfo.objects.create(email=input_em,pwd=input_pw) #增加数据 #models.UserInfo.objects.filter(email=input_em).delete() #删除数据 #models.UserInfo.objects.filter(email=input_em).update(pwd=999) #更新数据 #获取UserInfo表中的所有的数据 user_info_list = models.UserInfo.objects.all() #查收,在模板中循环 #user_info_list列表,列表的元素为一行;email,pwd; return render(request,\'index.html\',{\'user_info_list\':user_info_list})
4、模板index.html内容
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/index/" method="post"> <input type="text" name="em"/> <input type="text" name="pw"/> <input type="submit" name="添加"/> </form> <table border="1"> <thead> <tr> <th>邮箱</th> <th>密码</th> </tr> </thead> <tbody> {% for line in user_info_list %} <tr> <td>{{ line.email }}</td> <td>{{ line.pwd }}</td> </tr> {% endfor %} </tbody> </table> </body> </html>
--权限登录管理系统 1、登录(装饰器判断用户是否已经登录--可选,用户密码MD5) 2、注册(检测用户是否已经存在,onblur+ajax光标跳出输入框时) 3、注销(忽略) 4、用户管理(From表单) 重置密码 创建用户(单条,批量) 修改用户信息 5、权限控制(可选) 用户是否可以访问URL
内容:
一、URL路由系统
二、中间件
三、Model:数据库的操作(重点)
1、创建表
2、操作表数据
四、Form(重点)
1、用户提交数据验证
2、生成html标签
五、cookie和session
六、跨站请求伪造和跨站脚本攻击
七、Ajax操作(重点)
八、Admin
九、缓存
十、自定义分页(重点)
下面分开介绍:
Django请求生命周期
路由系统详细介绍:
分页的概念:
点击是url发生变化;
那么如何实现分页:路由系统函数传参
1、urls的内容:
from django.conf.urls import url,include from django.contrib import admin from app01 import views urlpatterns = [ url(r\'^admin/\', admin.site.urls), url(r\'^app01/\', include("app01.urls")), url(r\'^index/$\', views.index), #url(r\'^user_list/(\\d+)$\', views.user_list), #django内部默认将url以/为分割线将url分割,传入参数,默认是按照顺序传入参数的 #url(r\'^user_list/(\\d+)/(\\d+)$\', views.user_list), url(r\'^user_list/(?P<v1>\\d+)/(?P<v2>\\d+)$\', views.user_list), #要灵活传入参数,设置(?P<v1>\\d+),v1表示key,传入的参数为value url(r\'^$\', views.index), #放置到最后 ]
2、views的内容
from django.shortcuts import render,HttpResponse # Create your views here. def index(request): return HttpResponse(\'OK\') def user_list(request,v2,v1): #将key传入 print v1,v2 return HttpResponse(v1+v2)
对于不同的app而言,如何实现输入url为app01的请求发送到app01上面:
1、urls的内容