Django基础

web应用

   web应用顾名思义就是用户可以通过web来访问的一种应用程序,它有两种模式。

    ~ B/S模式  浏览器端/服务器端

    ~ C/S模式  客户端/服务端

  又因为用户多通过浏览器来访问web应用,所以多是B/S模式。其根本就是由socket来实现的。

import socket

def handle_request(client):

    request_data = client.recv(1024)
    print("recv_data: ",recv_data)

    client.send("HTTP/1.1 200 OK\r\nstatus: 200\r\nContent-Type:text/html\r\n\r\n".encode("utf8"))    #需要遵循http协议
    client.send("<h1>Hello,World!</h1><img src=''>".encode("utf8"))

def main():

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('localhost',8812))
    sock.listen(5)

    while True:
        print("the server is waiting for client-connection....")
        connection, address = sock.accept()
        handle_request(connection)
        connection.close()

if __name__ == '__main__':

    main()
View Code

 

http协议

  http是超文本传输协议的缩写。

    ~ 基于TCP/IP协议的应用层协议

    ~ 响应模式,只有从客户端开始建立连接

    ~ 对之前的请求和响应不进行保存

    ~ 每次只创建一个连接

  请求协议包括两种请求方式:

    ~ get请求 get请求通常是在url后加上问号来发送数据,并且有大小限制

    ~ post请求 把数据放在请求体中,没有大小限制

 

django简介

  MVC设计模式

    所谓MVC就是把Web应用分为模型(Model),控制器(Controller)和视图(View)三层,模型负责业务对象和数据库的关系映射,视图层负责页面,控制器负责根据请求实现响应操作。

  MTV设计模式

    M(Model)层,负责数据库和业务对象的关系映射,T(Templete)层,负责页面的设计(也就是一堆html文件),V(view),负责主要的业务逻辑。其实和MVC本质上都是一样的。

  实现一个基本的django工程的步骤:

    1,首先在model.py文件中创建所需要的表单关系。

    2,在url.py文件中的urlpattners中设置路由。

    3,在view.py文件中编写自己的业务逻辑。

    4,在Templete中,设计前端页面。

    注:1,若要使用SQLite外的数据库,需把settings.py文件中的DATABASES修改,如mysql:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'bms',           # 要连接的数据库,连接前需要创建好
        'USER':'root',        # 连接数据库的用户名
        'PASSWORD':'',        # 连接数据库的密码
        'HOST':'127.0.0.1',       # 连接主机,默认本级
        'PORT':3306            #  端口 默认3306
    }
}

      2,数据库迁移命令

        makemigrations;migrate

      3,跨站请求伪造保护,csrf_token,在settings文件中注释掉,或者在模板中加入csrf_token标签。

      4,如果你的sqlite打不开,或者报错,多半时因为你的dirver没有安装。

 

MVC

  路由控制

    本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码对应执行。

    里有正则表达式与URL进行匹配,在1.6版本之前,都是用url调用的,现在使用path和rpath。

    普通匹配

from django.conf.urls import url

from . import views

urlpatterns = [
    repath('articles/2003/$', views.special_case_2003),
    repath('articles/([0-9]{4})/$', views.year_archive),
    repath('articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),]

    反向解析 (通过别名联系到url)

from django.conf.urls import url

from . import views

urlpatterns = [
    path('articles/2003/', views.special_case_2003 name =case_2003),
    rpath('articles/([0-9]{4})/', views.year_archive name= year),
    rpath('articles/([0-9]{4})/([0-9]{2})/', views.month_archive),]

    分组

from django.conf.urls import url

from . import views

urlpatterns = [
    repath('articles/2003/$', views.special_case_2003),
    rpath('articles/(?P<year>[0-9]{4})/', views.year_archive),
    rpath('articles/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.month_archive),]

 

   View

  视图层,接受web请求并返回响应,响应一定要存在。

  django将请求报文中的请求行、首部信息、内容主体封装成 HttpRequest 类中的属性。

    requst.GET  QueryDict类型,类似于字典的对象,包含了http get的所有参数。

    request.POST  QueryDict类型,将请求中的表单数据进行封装

    request.body  字符串类型 代表了请求报文的主体,在处理非http形式的报文很有作用,如json

    request.path  字符串类型,返回请求的路径。

    request.method  字符串类型 , 返回请求方式,如"post","get"

      request。FILES  包含所有的上传文件的信息

    request.user    表示当前登陆的用户对象

    request.COOKIES  包含所有的cookie

    request.session  表示当前会话

  HttpResponse对象

    1,Httpresponse()  括号内加入字符串作为响应体

    2,render()  括号内有三个参数

      1)request  用于生成响应的请求对象

      2)template_name  模板的文件名

      3)context  一个字典,用于渲染模板

    3,redirect()  重定向一个硬编码的url

 

  Template

    template需要将自己的路径添加到settings.py中。django将html文件直接耦合到自己的工程中。

    模板语法

      1,变量

        {{ name. }}  注:可以使用句点符,但是不能需要参数

      2,过滤器

        1),{{obj | default:noting }}如果为空使用默认值

        2),{{obj | length}}  返回值的长度

        3),{{obj | filesizeformat}}  数据大小格式化,转换为人类可读的

        4),{{obj | date:"Y-m-d"}}  转换为格式化的日期

        5),{{obj | truncatechar:5}}  长度超过指定数值的用。。。结尾

        6),{{obj | safe}}  确保变量不会被转义

      3,标签

        1),{%for i in list %}  {%endfor%}     注:循环序号可以用  forloop.counter表示

        2),{% if %}  {%else%}  {%end if%}

        3),{%with%}  使用一个简单地名字缓存一个复杂的变量,当你需要使用一个“昂贵的”方法(比如访问数据库)很多次的时候是非常有用的

         4),{%csrf-token%}  用于跨站请求伪造保护

        

    

 

posted @ 2018-10-18 16:35  崔园樟  阅读(141)  评论(0)    收藏  举报