day_15_Django基础
0、bootstrap框架
Bootstrap 是最受欢迎的 HTML、CSS 和 JS 框架,用于开发响应式布局、移动设备优先的 WEB 项目。
响应式布局:根据分辨率进行样式的布局.
自适应:就是根据屏幕的分辨率自动的进行页面的扩大和缩小.
一、web框架介绍

浏览器:browser这个浏览器软件是把url当做一个参数,通过http协议对数据进行封装,并且发送到服务器上
web服务器:
1.apache和niginx是实现底层socket通信并且按照http协议对客户端发来的信息进行解析,交给web应用一个对象(相当于一个接口)。
apache和nginx做的是拆包和解包的过程。
2.web应用 根据解析的对象,返回给apache或是nginx,在进行封装,通过socket发送给客户端。
对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。
我们编程的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,
所以,需要一个统一的接口,让我们专心用Python编写Web业务。这个接口就是WSGI:Web Server Gateway Interface。
二、MVC和MTV模式
Django的MTV模式本质是各组件之间为了保持松耦合关系,Django的MTV分别代表:
Model(模型):负责业务对象与数据库的对象(ORM)
Template(模版):负责如何把页面展示给用户
View(视图):负责业务逻辑,并在适当的时候调用Model和Template
此外,Django还有一个url分发器,它的作用是将一个个URL的页面请求分发给不同的view处理,view再调用相应的Model和Template

settings.py 配置信息
urls.py 映射到视图函数
wsgi socket实现方式,实现对象的提取
独立的部分是一个应用,项目是应用的集合
三、命令行创建Django
1、创建一个django project
django-admin startproject mysite
• manage.py ----- Django项目里面的工具,通过它可以调用django shell和数据库等。
• settings.py ---- 包含了项目的默认设置,包括数据库信息,调试标志以及其他一些工作的变量。
• urls.py ----- 负责把URL模式映射到应用程序。
2、在mysite目录下创建应用,比如blog:
python manage.py startapp blog
四、pycharm创建一个django project
wsgi是把客户端发送过来的信息,进行解析封装成一个对象,根据urls中的规则,交给相应的views进行处理。
启动一个django project
python manage.py runserver 8800
五、Django中正则的运用
urls.py中文件的操作
正则匹配
根据匹配到的规则,交给相应views.py中的函数进行处理。
无名分组
相当于把这个分组当做一个位置参数,传递给views.py中的函数进行处理
有名分组
相当于把这个分组当做一个关键字参数,传递给views.py中的函数进行处理
url(r'^articles/2003/$', views.special_case_2003), url(r'^articles/([0-9]{4})/$', views.year_archive), # year_archive(request,2009) url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive), # month_archive(request,2009,04) url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive), # month_archive(request,year=2009,month=04) url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
匹配规则:
从上到下进行匹配,匹配成功,不往下进行匹配。
get和post的区别:
get请求是把请求的内容放在地址栏中,暴露至地址栏,地址栏不可能无限大,至多8K。例如:?a=2&c=3
post请求是把请求内容放在数据体中,对于数据是无限制的。
Including other URLconfs配置:
目的:解除各个应用之间的耦合性,就把各个应用的urls放在独立的应用之中。
from django.conf.urls import include, url urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^blog/', include('blog.urls')), ]
登录认证实例:
1、判断请求方式,根据请求方式进行操作。
QueryDict操作可以按照字典的方式进行操作,根据html中的name值,使用它的get方法
username=request.POST.get("username",None)
2、同源地址问题
浏览器中输入的url,包含IP和端口,这就是同源
3、别名
url(r'^login/', views.login,name="LOGIN"),
<form action="{% url 'LOGIN' %}" method="post">
urls.py
url(r'^login/', views.login,name="LOGIN"),
views.py
def login(request): # print("method",request.method) if request.method=="POST": username=request.POST.get("username",None) passsword=request.POST.get("pwd",None) if username=="alex" and passsword=="123": # return HttpResponse("登录成功!") return redirect("/back/") return render(request,"login.html")
login.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>登录页面</h1> <form action="{% url 'LOGIN' %}" method="post"> 用户名:<p><input type="text" name="username"></p> 密码:<p><input type="password" name="pwd"></p> <input type="submit" value="submit"> </form> </body> </html>
六、views(视图函数)
一个视图函数,或者简短来说叫做视图,是一个简单的Python函数,它接受web请求,并且返回web响应。
响应可以是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西都可以。
无论视图本身包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你的Python目录下面。
除此之外没有更多的要求了——可以说“没有什么神奇的地方”。为了能够把代码放在某个地方,惯例是把视图放在叫做views.py的文件中,
然后把它放到你的项目或者应用目录里。
from django.http import HttpResponse import datetime def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html)
请求对象:request
响应对象 Httpresponse()
问题:1、为什么不把返回内容直接放在views.py中,而是放在前端的html页面中呢?
2、如何把后端的变量嵌套进入前端的页面?
这就需要模板语言---->模板文件----->在从服务器发送到客户端之前进行渲染,放到html页面中,发送到客户端。
render(request, template_name, context=None) 将模板与上下文对象渲染的方法
locals() 就是把局部变量中的函数全部加在到模板文件中
#urls.py
url(r'^timer/', views.timer),
#views.py
import datetime def timer(req): # 如何把后端的变量嵌套进入前端页面 t=datetime.datetime.now() a=1 b=[1,23,4] #return render(req,"timer.html",{"Time":t,"a":a,"b":b}) # timer.html是一个模板文件 return render(req,"timer.html",locals()) # timer.html是一个模板文件 #return HttpResponse("<h1>Current time:%s</h1>"%t)
timer.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>Curr time {{ t }}{{ a }}</h1> </body> </html>
redirect函数---重定向
-----------------------------------url.py url(r"login", views.login), url(r"yuan_back", views.yuan_back), -----------------------------------views.py def login(req): if req.method=="POST": if 1: # return redirect("/yuan_back/") name="yuanhao" return render(req,"my backend.html",locals()) return render(req,"login.html",locals()) def yuan_back(req): name="苑昊" return render(req,"my backend.html",locals()) -----------------------------------login.html <form action="/login/" method="post"> <p>姓名<input type="text" name="username"></p> <p>性别<input type="text" name="sex"></p> <p>邮箱<input type="text" name="email"></p> <p><input type="submit" value="submit"></p> </form> -----------------------------------my backend.html <h1>用户{{ name }}你好</h1> #总结: render和redirect的区别: # 1 if render的页面需要模板语言渲染,需要的将数据库的数据加载到html,那么所有的这一部分 # 除了写在yuan_back的视图函数中,必须还要写在login中,代码重复,没有解耦. # 2 the most important: url没有跳转到/yuan_back/,而是还在/login/,所以当刷新后 # 又得重新登录.
七、template(模板文件)
python的模板:HTML代码+逻辑控制代码
模板支持的语法
变量(使用双大括号来引用变量)
深度变量的查找(万能的句点号)
{% if %} 的使用
{% for %}的使用
#urls.py
url(r'^template/', views.template),
#views.py
def template(request): name="hello" l=[111,222,333] d={"name":"alex","age":35} class Person(): id=3 age=22 name="egon" class Person1(): id=3 age=12 name="egon" name_list=[Person(),Person(),Person1()] return render(request,"template.html",locals())
#template.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>{{ p.name }}</h1> <h1>{{ p.id }}</h1> <h1>{{ p.age }}</h1> <h1>{{ d.name }}</h1> <h1>{{ d.age }}</h1> <h1>{{ l.0 }}</h1> <h1>{{ l.1 }}</h1> <h1>{{ l.2 }}</h1> <h1>{{ name }}</h1> <h1>展示用户信息</h1> {% for obj in name_list %} {% if obj.age > 20 %} <p>{{ obj.name }} {{ obj.id }}{{ obj.age }}</p> {% endif %} {% endfor %} {#{{ name_list.0.name }}#} {#{{ name_list.0.age }}#} {#{{ name_list.0.id }}#} {#{{ name_list.1.name}}#} {#{{ name_list.1.age}}#} {#{{ name_list.2.name }}#} </body> </html>
八、orm操作(对象关系映射)
Models(数据库操作)
python的类-------------数据表
python的类实例-------表的记录
python的类属性-------表的字段
原生sql效率高于orm,
orm就是一个封装的翻译机,很重要。
Django默认的数据库引擎是sqlite3
使用orm对数据库进行增删改查操作
python创建表
python manager.py makemigrations # python创建表
python manager.py migrate # 生成表
数据库中每张表必须有一个主键,1.非空 2.唯一
filter匹配的结果认为是一个集合对象
get匹配的结果是单一对象
b.save() 把所有字段都更新一遍,效率较低
增(create , save)
删(delete)
改(update和save)
查(filter,value等)
#urls.py
url(r'^login/', views.login,name="LOGIN"), url(r'^back/', views.back), url(r'^add_books/', views.add_books), url(r'^delete_books/', views.delete_books), url(r'^edit_books/', views.edit_books),
#models.py
from django.db import models # Create your models here. #ORM:对象关系映射 python的类------------数据表 # python的类实例------------表的记录 # python的类属性------------表的字段 class Books(models.Model): title=models.CharField(max_length=32) author=models.CharField(max_length=32) price=models.FloatField(null=True) pub_date=models.DateField(null=True)
#views.py
from django.shortcuts import render,HttpResponse,redirect def login(request): # print("method",request.method) if request.method=="POST": username=request.POST.get("username",None) passsword=request.POST.get("pwd",None) if username=="alex" and passsword=="123": # return HttpResponse("登录成功!") return redirect("/back/") return render(request,"login.html") def back(req): obg_list=Books.objects.all() # [obj,obj...] return render(req,"back.html",locals()) from blog.models import * def add_books(request): # 创建记录两种方式: 1 create 2 save #Books.objects.create(title="python",author="egon",price=12,pub_date="2000 12 12") #注意:pub_date因为是Datetime数据类型,所以,格式固定:-------"2000-12-12" b=Books(title="JAVA",author="yuan",price=12.12) b.save() #return HttpResponse("添加成功!") return redirect("/back/") def delete_books(req): nid=req.GET.get("id") Books.objects.filter(id=nid).delete() #Books.objects.filter(title="JAVA").delete() return redirect("/back/") def edit_books(req): nid = req.GET.get("id") # b=Books.objects.get(id=nid) #filter取到的是集合对象,get是单一对象 # b.price=100 # b.save() # 效率较低 Books.objects.filter(id=nid).update(price=100) return redirect("/back/")
#login.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>登录页面</h1> <form action="{% url 'LOGIN' %}" method="post"> 用户名:<p><input type="text" name="username"></p> 密码:<p><input type="password" name="pwd"></p> <input type="submit" value="submit"> </form> </body> </html>
#back.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>hello {{ name }}</h1> <h1>书籍管理工具</h1> {% for obj in obg_list %} <p>书名{{ obj.title }} 作者 {{ obj.author }} 日期{{ obj.pub_date }} <a href="/delete_books/?id={{ obj.id }}">删除</a><a href="/edit_books/?id={{ obj.id }}">编辑</a></p> {% endfor %} <a href="/add_books/">添加</a> </body> </html>

浙公网安备 33010602011771号