• 初识django


    初识django

    简易的web框架

    首先,既然是一个web框架就一定少不了socket套接字,那就先搭建一个socket套接字,因为是个b/s的架构,所以只需要写一个服务端,客户端由浏览器充当

    import socket
    
    server = socket.socket()
    
    server.bind(
        ('127.0.0.1',8080)
    )
    
    server.listen(5)
    
    while True:
        conn,addr = server.accept()
    
        data = conn.recv(1024)
    
        print(data)
        # 让数据符合HTTP协议才能发送成功
        conn.send(b'HTTP/1.1 200 ok
    
    ')
    
        conn.send(b'hello world')
    
        conn.close()
    
    # data的结果
    '''
    #请求首行,标识遵循的协议
    b'GET /abc HTTP/1.1
    
    
    #请求头
    Host: 127.0.0.1:8080
    
    Connection: keep-alive
    
    Cache-Control: max-age=0
    
    Upgrade-Insecure-Requests: 1
    
    
    # 用来标识用户是否是一个浏览器,也是最基本的防爬措施
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) 
    
    AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36
    
    Sec-Fetch-Mode: navigate
    
    Sec-Fetch-User: ?1
    
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;
    q=0.8,application/signed-exchange;v=b3
    
    Sec-Fetch-Site: none
    
    Accept-Encoding: gzip, deflate, br
    
    Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
    
    Cookie: 
    csrftoken=IjRfRStHOgm6vLqz4cU1dsUcMmqXkvMfsYMdBSSwpogWO9qjWG2nkedlhdEI5gaQ
    
    
    # 在请求头和请求体中间要有一个换行,需要注意,面试会问
    
    '
    
    # 请求体
    
    '''
    
    

    如果用户访问的页面的url变了,我们又怎么去根据用户的ur来返回相应的资源?所以我们首先就要得到用户访问的url,从我们答应的data 的结果中我们可以发现,在请求首行中带有用户访问的url,

    我们得到的数据是二进制的格式,所以就要先转化成字符的格式

    data_str = data.decode('utf-8')
    

    把二进制转化成字符后,我们就可以根据/r/n切割成一个列表,因为是请求首行,所以去索引0就可以得到请求头,然后再通过空格切割,取索引1就可以得到我们想要的url后缀,得到这个后缀我们就可以知道用户所访问的url

    current_path = data_str.split('/r/n')[0].split(' ')[1]
    

    得到用户访问的url后我们就可以根据这个url进行判断,然后返回相应的数据

    if current_path = '/index':
        conn.send('index')
     else:
        conn.send(b'404 error')
    

    在这个web框架中我们发现,这些东西的套路都是很固定的,如果换个人写也是差不多的,所以就一定会有一个模块来帮我i们做这件事,这个模块就是wsgiref,他能实现web服务网关接口,那么接下来就跟据这个函数来搭建

    # wsgiref.py
    from wsgiref.simple_server import make_server
    from urls import urls
    from views import *
    
    def run(env,response):
        """
        :param env: 请求相关的所有数据 将http数据全部提前处理成了字典的形式 供调用者使用
        :param response: 响应相关的所有数据
        :return: 给前端真正的数据
        """
        # print(env)
        response('200 OK',[('xxx','jason'),])
        current_path = env.get('PATH_INFO')
      
        func = None
        for url in urls:  # url =  ('/login',login)  ('/index',index)
            if current_path == url[0]:  # 用户敲的后缀名 你后端有对应的处理业务
                func = url[1]  # 将匹配上的函数名赋值给func变量
                break  # 一旦用户匹配上了对应的业务接口 立刻结束匹配
        # 判断func是否被赋值
        if func:
            res = func(env)
        else:
            res = error(env)
        return [res.encode('utf-8'),]
    
    
    if __name__ == '__main__':
        server = make_server('127.0.0.1',8080,run)  # 实时监听本机8080端口
        # 一旦有请求来了 会统一交给run函数处理(调用run函数并传参run(env,response))
        server.serve_forever()  # 启动服务端
    
    # urls.py
    
    from views import *
    
    
    urls = [
        ('/login',login),
        ('/index',index),
        ('/reg',reg),
        ('/xxx',xxx),
        ('/get_time',get_time),
        ('/get_userdict',get_userdict),
        ('/get_data',get_data),
    ]
    
    # views.py
    
    def login(env):
        return 'login'
    
    def index(env):
        return 'index'
    
    def reg(env):
        return 'reg'
    
    def xxx(env):
        # return 'xxx'
        with open(r'templates/02 xxx.html','r',encoding='utf-8') as f:
            return f.read()
    
    def error(env):
        return '404 error'
    

    在这些文件里

    views.py 存放的是视图函数

    urls.py存放的是路由与视图函数的对应关系

    python三大主流的web框架

    1. django: 优点:这个框架的封装的东西很多,自带的功能非常多

      ​ 缺点:比较笨重,比较适合写大一点的项目,小项目优点大材小用

    2. flask:这个框架集成的东西不多,大部分依赖于第三方的模块,但是如果将所有的第三方模块加起来可能直接盖过django

    3. tornado:基于异步非阻塞的思想开发,这个框架很快,甚至都可以用来开发游戏的服务器

    django框架介绍

    jango是一个以开发app为主要功能的web框架
    app就是application应用的意思

    一个django项目就是一所大学(空的架子 本身没有任何功能)
    而app就类似于大学里面的各个学院

    一个空的django本身没有任何作用 仅仅是为app提高前期的环境配置

    你可以根据功能的不同 开发多个app
    一个app对应一个具体的功能模块
    用户相关的功能 用户相关的app
    订单相关的功能 订单相关的app
    商品相关的功能 商品相关的app

    每一个app都有自己独立的功能

    注意事项

    1. 计算机名称不能有中文
    2. python解释最好不要使用3.7,因为有bug没解决,最好使用3.4~3.6
    3. 一个pycharm窗口只能运行一个项目

    django版本

    目前,django版本是以1.11.11为主,最好不要使用最新版本的工具,可能不稳定,有很多bug

    django安装

    pip install Django == 1.11.11

    或者在settings中安装

    安装后,可以在命令行中输入django-admin 来判断是否安装成功

    创建django项目

    基于命令行创建项目

    1. 创建django项目:django-admin startproject 项目名

    2. 启动django项目:注意要现切换到项目的目录下python manage.py runserver

      ​ 或者python manage.py runserver 127.0.0.1:8080指定端口

    3. 创建应用(app):python manage.py startapp app01(应用名称)

    在使用命令行的时候需要注意,

    1. 你存放HTML的文件templates文件夹不会自动创建
    TEMPLATES = [
        {
            'BACKEND': 'django.template.backends.django.DjangoTemplates',
            # 需要手动添加
            'DIRS': [os.path.join(BASE_DIR, 'templates')],
            'APP_DIRS': True,
            'OPTIONS': {
                'context_processors': [
                    'django.template.context_processors.debug',
                    'django.template.context_processors.request',
                    'django.contrib.auth.context_processors.auth',
                    'django.contrib.messages.context_processors.messages',
                ],
            },
        },
    ]
    
    
    1. 创建好的应用需要在django配置文件中注册才能使用
    INSTALLED_APPS = [
    			'django.contrib.admin',
    			'django.contrib.auth',
    			'django.contrib.contenttypes',
    			'django.contrib.sessions',
    			'django.contrib.messages',
    			'django.contrib.staticfiles',
    			# 'app01'  # 简便写法
    			'app01.apps.App01Config'  # 最完整的写法
    		]
    

    通过pycharm创建

    通过pycharm 创建比较简单,在pycharm中的文件选项选择新建django项目,然后填好项目的名称

    通过pycharm可以默认新建一个app,填写app名称即可

    和通过命令行创建一样,在新建app后也要先注册才可生效

    django的项目目录

    django给前端传输数据的三种方式

    1. HttpResponse 返回字符串

    2. render 返回html文件
      可以给html页面传值

      def login(request)
      	user_dic = {'username':'jason','password':'123'
      	return render(request,'login.html',{'xxx':user_dic}
      
    3. redirect 重定向

      1.直接写你本网站的路径后缀
      2.也可以全路径

       def home(request)
       	# return redirect('/login')  # 重定向
        	return redirect('https://www.baidu.com')  # 重定向
      
      
  • 相关阅读:
    PHP线程安全
    Oracle中MD5+Base64加密实现
    1002. A+B for Polynomials (25)
    1001. A+B Format (20)
    Rails,uva 514
    Database,Uva1592
    Hello World for U
    D3.js 力导向图
    从零开始CSS(一 2016/9/21)
    从零开始HTML(三 2016/9/20)
  • 原文地址:https://www.cnblogs.com/lyyblog0715/p/11908566.html
Copyright © 2020-2023  润新知