Python Web框架【Django框架第一篇基础】

Django框架第一篇基础【DjangoMTV模式】

 
 
老师博客【www.cnblogs.com/yuanchenqi/articles/6811632.html】
同窗博客:http://www.cnblogs.com/haiyan123/p/7701412.html
Django官网:https://www.djangoproject.com/download/
 
 

1、安装Django

DjangoMTV模式
Django的MTV模式本质是各组件之间为了保持松耦合关系,Django的MTV分别表明:
      Model(模型):负责业务对象与数据库的对象(ORM)
      Template(模版):负责如何把页面展现给用户
      View(视图):负责业务逻辑,并在适当的时候调用Model和Template
      此外,Django还有一个url分发器,它的做用是将一个个URL的页面请求分发给不一样的view处理,view再调用相应的Model和Template
 
 
windows7
1.一、经过cmd命令行到python-3.5.4\Scripts目录下,执行“pip3.5.exe install Django”命令【注意版本】
D:\办公软件\python-3.5.4\Scripts> pip3 install Django==1.11.13
删除命令
C:\Users\Administrator> pip uninstall Django
 
1.二、将django命令加入环境变量
【【右键计算机】--》【属性】--》【高级系统设置】--》【高级】--》【环境变量】--》【在第二个内容框中找到 变量名为Path 的一行,双击】 --> 【Python安装目录追加到变值值中,用 ; 分割】】
D:\办公软件\python-3.5.4;D:\办公软件\python-3.5.4\Scripts
 
验证是否安装成功
 
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import django
print(django.get_version())
D:\办公软件\python-3.5.4\python.exe E:/Python/Python自动化开发/day15/Django/a.py
1.11.13

 

2、Django基本命令

2.一、使用命令建立一个Django项目
E:\Django_project> django-admin startproject mysite
当前目录下会生成mysite的工程,目录结构以下:
  • manage.py ----- Django项目里面的工具,经过它能够调用django shell和数据库等。
  • settings.py ---- 包含了项目的默认设置,包括数据库信息,调试标志以及其余一些工做的变量。
  • urls.py ----- 负责把URL模式映射到应用程序。
  • wsgi.py----相似于nginx的功能模块
 
2.二、在mysite目录下建立应用,好比blog:
E:\Django_project\mysite> python manage.py startapp blog
  • models.py----配置和数据库有关的操做
  • views.py----视图模块;全部的视图函数
 
 
2.三、使用pycharm建立django项目
 
2.四、配置文件
    1】在urls.py文件里加入和视图的对应关系
from django.contrib import admin
from django.urls import path
#应用blog下的views文件
from blog import views
 
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    #对应关系;调用views里的index函数【首页】【http://127.0.0.1:8800/blog/】
    url(r'^blog/', views.index),
]

 

 
    2】在视图文件views.py里编写和urls.py里对应的首页信息;
from django.shortcuts import render,HttpResponse
# Create your views here.
#必须加参数;通常都用request【是请求信息对象】;HttpResponse【是响应信息对象】
def index(request):
    #返回一个字符串
    #return  HttpResponse("<h1>welcome python zhangyu</h1>")
    #返回页面;第一次参数是request;第二个参数是在templates目录下的文件;不须要导入;直接写就能够
    return render(request,"index.html")

 

2.五、在pycharm启动django
E:\Python\Python自动化开发\day15\Django\Mysite> python manage.py runserver 8800
 
2.六、访问http://127.0.0.1:8800/
http://127.0.0.1:8800/blog/
 
 
 

Django须要掌握四部分

1、URL控制
2、views【视图函数】
3、Template【存放.html文件】
4、Models【数据库操做】
 
urls===>views===>templates===>mdoels
 
 
 

1、URL控制

1.1【url和视图函数的映射表】
URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表。你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码
 
"""
urlpatterns = [
         url(正则表达式, views视图函数,参数,别名),
]
 
参数说明:
    一个正则表达式字符串
    一个可调用对象,一般为一个视图函数或一个指定视图函数路径的字符串
    可选的要传递给视图函数的默认参数(字典形式)
    一个可选的name参数
"""
 
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    #对应关系;调用views里的index函数【首页】【http://127.0.0.1:8800/blog/】
    url(r'^blog/', views.index),
    url(r'^articles/2003/$', views.special_case_2003),
    #有括号的话就是单一个参数;要在视图views.year_archive里加参数
    url(r'^articles/([0-9]{4})/$', views.year_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]
 
    1 一旦匹配成功则再也不继续
    2 若要从URL 中捕获一个值,只须要在它周围放置一对圆括号。
    3 不须要添加一个前导的反斜杠,由于每一个URL 都有。例如,应该是^articles 而不是 ^/articles。
    4 每一个正则表达式前面的'r' 是可选的可是建议加上。
 
一些请求的例子:
 
    /articles/2005/3/ 不匹配任何URL 模式,由于列表中的第三个模式要求月份应该是两个数字。
    /articles/2003/ 将匹配列表中的第一个模式不是第二个,由于模式按顺序匹配,第一个会首先测试是否匹配。
    /articles/2005/03/ 请求将匹配列表中的第三个模式。Django 将调用函数
                       views.month_archive(request, '2005', '03')。
View Code

 

1.2【有名分组(named group)】
上面的示例使用简单的、没有命名的正则表达式组(经过圆括号)来捕获URL 中的值并以位置 参数传递给视图。在更高级的用法中,可使用命名的正则表达式组来捕获URL 中的值并以关键字 参数传递给视图。
在Python 正则表达式中,命名正则表达式组的语法是 (?P<name>pattern),其中name 是组的名称,pattern 是要匹配的模式。
关键字参数也对应
    #有括号的话就是单一个参数;要在视图views.year_archive里加参数
    url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),
    url(r'^articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/([0-9]+)/$', views.article_detail),
    
在视图参数里;即便参数位置变化也能取到值
def article_detail(request,year,month,id):
View Code

 

1.3 【URLconf 在什么上查找】
URLconf 在请求的URL 上查找,将它当作一个普通的Python 字符串。不包括GET和POST参数以及域名。
例如,http://www.example.com/myapp/ 请求中,URLconf 将查找myapp/。
在http://www.example.com/myapp/?page=3 请求中,URLconf 仍将查找myapp/。
URLconf 不检查请求的方法。换句话讲,全部的请求方法 —— 同一个URL的POST、GET、HEAD等等 —— 都将路由到相同的函数。
 
1.4 【捕获的参数永远是字符串】
每一个捕获的参数都做为一个普通的Python 字符串传递给视图,不管正则表达式使用的是什么匹配方式。例如,下面这行URLconf 中:
url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
views.year_archive() 的year 参数将是一个字符串
 
1.5【URL分发】【在本身的项目独立建urls文件】
 
分出去的URL;访问时;要加项目名http://127.0.0.1:8800/blog/articles/2003/
 
 
Django接收post请求时会报错;须要注释settings.py文件里的这行
    'django.middleware.csrf.CsrfViewMiddleware',
 
1.6【别名name='INDEX'】
设置好别名后;URL怎么改都不会对项目有影响
urls.py文件
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', views.login,name="LOGIN"),
]

 

login.html文件
<h1>登陆页面</h1>
{#    <form action="/index/" method="post">#}
     <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>

 

2、views【视图函数】

一个视图函数,或者简短来讲叫作视图,是一个简单的Python函数,它接受web请求,而且返回web响应。响应能够是一张网页的HTML内容,一个重定向,一个404错误,一个XML文档,或者一张图片. . . 是任何东西均可以。不管视图自己包含什么逻辑,都要返回响应。代码写在哪里也无所谓,只要它在你的Python目录下面。除此以外没有更多的要求了——能够说“没有什么神奇的地方”。为了可以把代码放在某个地方,惯例是把视图放在叫作views.py的文件中,而后把它放到你的项目或者应用目录里。
 
请求对象:request【每一个视图函数里必定有request参数;封装全部数据对象】
响应对象:HttpResponse【每次return的值必定是HttpResponse的对象】
 
2.一、访问url返回时间实例
urls文件
from django.conf.urls import url,include
from django.contrib import admin
#应用blog下的views文件
from blog import views
 
urlpatterns = [
    url(r'^timer/',views.timer),
]

 

views文件
import datetime
def timer(req):
    #当前时间
    t=datetime.datetime.now()
    #返回当前时间
    return HttpResponse("<h1>Current time:%s</h1>" %t)
 
让咱们逐行阅读上面的代码:
  • 首先,咱们从 django.http模块导入了HttpResponse类,以及Python的datetime库。
  • 接着,咱们定义了timer函数。它是一个视图函数。每一个视图函数都应接收HttpRequest对象做为第一个参数,通常叫作request。
  • 注意视图函数的名称并不重要;不须要用一个统一的命名方式来命名,以便让Django识别它。咱们将其命名为timer,是由于这个名称可以精确地反映出它的功能。
  • 这个视图会返回一个HttpResponse对象,其中包含生成的响应。每一个视图函数都要返回HttpResponse对象
'''
http请求-响应过程当中有两个核心对象:
        http请求对象:HttpRequest
        http响应响应:HttpResponse
所在位置:django.http
'''
 
HttpRequest对象
属性:
'''
path:       请求页面的全路径,不包括域名
 
method:     请求中使用的HTTP方法的字符串表示。全大写表示。例如
 
               if  req.method=="GET":
 
                         do_something()
 
               elif req.method=="POST":
 
                         do_something_else()
 
GET:         包含全部HTTP GET参数的类字典对象
 
POST:       包含全部HTTP POST参数的类字典对象
 
COOKIES:     包含全部cookies的标准Python字典对象;keys和values都是字符串。
 
FILES:      包含全部上传文件的类字典对象;FILES中的每个Key都是<input type="file" name="" />标签中
             name属性的值,FILES中的每个value同时也是一个标准的python字典对象,包含下面三个Keys:
 
             filename:      上传文件名,用字符串表示
             content_type:   上传文件的Content Type
             content:       上传文件的原始内容
 
 
user:       是一个django.contrib.auth.models.User对象,表明当前登录的用户。若是访问用户当前
             没有登录,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。你
             能够经过user的is_authenticated()方法来辨别用户是否登录:
             if req.user.is_authenticated();只有激活Django中的AuthenticationMiddleware
             时该属性才可用
 
session:    惟一可读写的属性,表明当前会话的字典对象;本身有激活Django中的session支持时该属性才可用。
 
'''
View Code
 
2.二、render函数
如何把后端的变量嵌套进入前端页面
在html页面用{{}}标记;里面填写render里{}的值
大体流程
    一、render找到html文件;并设置变量{}
    二、在html文件里{{}}填写实战的变量
    三、渲染完后返回给return
render方法有两个功能;一、返回一个也没;二、模版语法:将变量嵌入到html页面中
 
views文件
import datetime
def timer(req):
    #当前时间
    t=datetime.datetime.now()
    #返回当前时间
    #return HttpResponse("<h1>Current time:%s</h1>" %t)
    #返回结果使用render渲染;
    """
    一、render会找到timer.html模版文件;
    二、在timer.html文件里找到{{}}在里面写Time;
        如:<h1>Current time: {{ Time }}</h1>
    """
    return render(req,"timer.html",{"Time":t})
View Code
 
html文件
<body>
{#    把后端的变量嵌套进入前端页面#}
    <h1>Current time: {{ Time }}</h1>
</body>

 

render函数
  • ---------------render(request, template_name[, context])
  • 结合一个给定的模板和一个给定的上下文字典,并返回一个渲染后的 HttpResponse 对象。
  • 参数:
  •      request: 用于生成响应的请求对象。
  •      template_name:要使用的模板的完整名称,可选的参数
  •      context:添加到模板上下文的一个字典。默认是一个空字典。若是字典中的某个值是可调用的,视图将在渲染模板以前调用它。
  •      content_type:生成的文档要使用的MIME类型。默认为DEFAULT_CONTENT_TYPE 设置的值。
  •      status:响应的状态码。默认为200。
 
2.三、重定向redirect函数
须要引用redirect模块
以登陆网页为例子
urls文件
urlpatterns = [
    url(r'^login/', views.login,name="LOGIN"),
    url(r'^back',views.back),
]

 

views文件【这里须要注意locals】
def login(req):
    if req.method=='POST':
        username=req.POST.get('username',None)
        password=req.POST.get('pwd',None)
        if username=='alex' and password=='123':
            #return HttpResponse("登录成功")
            #若是登陆成功转到back的URL
            return redirect("/back")
    return render(req,'login.html')
 
def back(req):
    name="alex"
    #locals表示当前函数内的全部变量;在back文件里直接写{{name}}就能够
 
 
    return render(req,"back.html",locals())
View Code

 

login.html文件
<body>
<h1>登陆页面</h1>
{#    <form action="/index/" method="post">#}
     <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>

 

back.html文件
<body>
    <h1>hello {{ name }}</h1>
</body>

 

思路:
  1. 编写urls文件:http://127.0.0.1:8800/login和http://127.0.0.1:8800/back
  2. 编写views视图文件:编写登陆函数login(req);登陆验证;和登陆成功跳转url【return redirect("/back")】
  3. 编写views视图文件:编写用户界面函数back(req);直接返回用户界面页面back.html;locals表示当前函数内的全部变量;在back文件里直接写{{name}}就能够
 
 

3、Template【存放.html文件】

 
 这部分我都是看老师或者同窗的博客;第一天学;这块有点模糊;
 
 
 
 

4、Models【数据库操做】

 
4.1 ORM表模型【models文件】
from django.db import models
 
# Create your models here.
 
#ORM:对象关系映射【python的类-----数据表
#                   python的类实例-----表的记录
#                   python的类属性-----表的字段
 
 
#建立Books表
class Books(models.Model):
    #主键
    #nid=models.IntegerField(primary_key=True)
    #标题-字符串-32字节
    title=models.CharField(max_length=32)
    #做者
    author=models.CharField(max_length=32)
    #价格
    price=models.FloatField()
    #出版时间
    pub_date=models.DateField()
View Code

 

E:\Python\Python自动化开发\day15\Django\Mysite> python manage.py makemigrations
Migrations for 'blog':
  blog\migrations\0001_initial.py
    - Create model Books
 
E:\Python\Python自动化开发\day15\Django\Mysite> python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions
 
注释
在你改动了 model.py的内容以后执行下面的命令:
python manger.py makemigrations
至关于 在该app下创建 migrations目录,并记录下你全部的关于modes.py的改动,好比0001_initial.py, 可是这个改动尚未做用到数据库文件
你能够手动打开这个文件,看看里面是什么
在此以后执行命令
python manager.py migrate
将该改动做用到数据库文件,好比产生table之类
 
4.2 ORM之增(create,save)、删(delete)、改(update和save)、查(filter,value)、
在urls.py里添加url【这个是总的】
from django.conf.urls import url,include
from django.contrib import admin
#应用blog下的views文件
from blog import views
 
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^login/', views.login,name="LOGIN"),
    #对应关系;调用views里的index函数【首页】【http://127.0.0.1:8800/blog/】
    url(r'^blog/', include('blog.urls')),
    url(r'^timer/',views.timer),
    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

 

views.py文件
from django.shortcuts import render,HttpResponse,redirect
# Create your views here.
#必须加参数;通常都用request【是请求信息对象】;HttpResponse【是响应信息对象】
def index(request):
    #返回一个字符串
    #return  HttpResponse("<h1>welcome python zhangyu</h1>")
    #返回页面;第一次参数是request;第二个参数是在templates目录下的文件;不须要导入;直接写就能够
    return render(request,"index.html")
 
def login(req):
    if req.method=='POST':
        username=req.POST.get('username',None)
        password=req.POST.get('pwd',None)
        if username=='alex' and password=='123':
            #return HttpResponse("登录成功")
            #若是登陆成功转到back的URL
            return redirect("/back")
    return render(req,'login.html')
 
 
#引用models模块
from blog.models import *
 
#ORM-查看数据
def back(req):
    #这里要注意在html文件里怎么去obg_list的值
    obg_list=Books.objects.all()
    #locals表示当前函数内的全部变量;在back文件里直接写{{name}}就能够
    return render(req,"back.html",locals())
 
#ORM-增长数据
def add_books(request):
 
    #建立记录的两种方式:1/create   2/save
    #注意:pub_date是Datetime数据类型;格式固定【2018-05-10】
    #Books.objects.create(title="python",author="egon",price=89,pub_date="2018-05-10")
 
    b=Books(title="JAVA",author="zhangyu",price=11,pub_date="2111-11-11")
    #调用save;保存到数据库
    b.save()
    #return HttpResponse("添加成功!!!")
    return redirect("/back/")
 
 
#ORM-删除数据
def delete_books(req):
    #取/delete_books?id=3里面的id
    id=req.GET.get("id")
    #filter帅选过滤;而后删除
    Books.objects.filter(id=id).delete()
    return redirect("/back/")
 
#ORM-编辑数据
def edit_books(req):
    id = req.GET.get("id")
    #filter和get都是筛选条件;filter取到的是集合对象;get是单一对象
    # b=Books.objects.get(id=id)
    # b.price=100
    # b.save()#效率低
    Books.objects.filter(id=id).update(price=100)
    return redirect("/back/")
View Code

 

back.html文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>hello {{ name }}</h1>
<h1>书籍管理工具</h1>
{#注意这里的变量;深度变量的查找(万能的句点号)#}
{% for obj in obg_list %}
    <p>书名{{ obj.title }} 做者{{ obj.author }} 日期{{ obj.pub_date }} 价格{{ obj.price }} <a href="/delete_books/?{{ obj.id }}">删除</a> <a href="/edit_books/?id=5">编辑</a></p>
{% endfor %}
<a href="/add_books/">添加</a>
 
 
</body>
</html>
View Code

 

下面是练习的截图
 
 
相关文章
相关标签/搜索