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),
View Code

 

匹配规则:
从上到下进行匹配,匹配成功,不往下进行匹配。

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')),
]
View Code

 

登录认证实例:
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"),
View Code

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")
View Code

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>
View Code

六、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)
View Code

请求对象:request
响应对象 Httpresponse()

问题:1、为什么不把返回内容直接放在views.py中,而是放在前端的html页面中呢?
2、如何把后端的变量嵌套进入前端的页面?
这就需要模板语言---->模板文件----->在从服务器发送到客户端之前进行渲染,放到html页面中,发送到客户端。
render(request, template_name, context=None) 将模板与上下文对象渲染的方法
locals() 就是把局部变量中的函数全部加在到模板文件中

#urls.py

url(r'^timer/', views.timer),
View Code

#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)
View Code

timer.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>

<h1>Curr time {{ t }}{{ a }}</h1>

</body>
</html>
View Code

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/,所以当刷新后
#     又得重新登录.
View Code

七、template(模板文件)
python的模板:HTML代码+逻辑控制代码

模板支持的语法
变量(使用双大括号来引用变量)
深度变量的查找(万能的句点号)
{% if %} 的使用 
{% for %}的使用


#urls.py

url(r'^template/', views.template),
View Code

#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())
View Code

#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>
View Code

 

八、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),
View Code

#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)
View Code

#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/")
View Code

#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>
View Code

#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>
View Code

 

posted @ 2017-05-11 21:06  huaxiayidao  阅读(53)  评论(0)    收藏  举报