django swift登录系统

时间:2016-04-18 22:40:57

标签: ios django swift rest

我已经创建了一个django网络应用程序,其中包含一个简单的用户表(用户名/密码)。我也有一个iOS应用程序(swift)设置,并想知道什么是编写登录系统的最佳方式?

从我从研究中收集到的内容 - 我将不得不对从现有django应用程序创建的API进行REST调用。为此使用TastyPie或Django Rest Framework会更好吗?

在为django应用程序执行API时,我是否需要记住具体的事项?另外,我用于其余调用的url是什么,它是django web应用程序所在的现有服务器吗?

2 个答案:

答案 0 :(得分:3)

我对此答案的资格来自于与您描述的系统相同的系统上的3个月的工作。你的问题包含很多部分,所以我将从服务器开始。

  

从我从研究中收集到的内容 - 我将不得不制作REST   调用从现有django应用程序创建的API。

正确,您的客户(应用,网络或其他)应通过API与您的服务器通信。

  

我已经创建了一个django网络应用程序,带有一个简单的用户表   (用户名/密码)。

希望您的“简单用户表”使用默认的Django用户模型,因为在保护开放API时,第三方安全框架将使您的生活变得更加简单。虽然这取决于您的安全需求,但我建议使用Django OAuth Toolkit来获取其OAuth2支持,密码重置工作流以及用于常见身份验证交互的预建URL端点。更好的是,这个库原生支持Django Rest Framework。

  

为此使用TastyPie或Django Rest Framework会更好吗?

我没有使用TastyPie的经验,但我可以担保DRF。 generic views与我们的主要API设计点相匹配,DRF与Django Form API的相似性意味着我们的自定义仪表板与API具有完美的对称性。我建议您首先绘制API的主要组件,然后研究两个框架,以了解最适合您项目的框架。

(额外提示:如果这是您第一次设计REST API,请翻阅Build APIs You Won't Hate的副本)

  

此外,我将用于其余呼叫的网址是什么   django Web应用程序所在的现有服务器?

通常的做法是在子域上托管您的API网址,然后是版本路径,例如api.example.com/v1/。子域将您的URL与核心网页分开,并表示这些端点专门用于您的API。在升级时,版本路径是支持旧API的良好做法。

  

在执行API时,我是否需要记住具体的事项   对于django app?

安全性很重要。根据您的API,您的应用程序的某些敏感部分可能会向公众公开。编写测试以确保您不会在安全性中发现新漏洞,并leave OAuth to the pros。除此之外,请确保您的服务器已准备好处理流量,并花费大量时间perfecting your model

  

我也有一个iOS应用程序(swift)设置,并想知道会是什么   编写登录系统的最佳方法是什么?

在客户端编码时,始终使用最佳实践来检索和存储凭据。通过SSL与您的服务器通信,仅存储您需要的内容,并在用户注销时销毁预期的数据。请记住,如果您的应用程序存储用户名和密码,它会存储敏感数据(因为人们对reuse passwords for important things有一种有趣的倾向)。最后,通过有用的错误消息和加载动画,清楚地将登录过程传达给您的用户。正如您现在所看到的,登录过程相当复杂,但如果执行得当,它将毫不费力。

答案 1 :(得分:1)

  1. 登录表格

    class ViewController: UIViewController, UITextViewDelegate, UITextFieldDelegate{
    
    
    @IBOutlet var txtemail: UITextField!
    @IBOutlet var txtpass1: UITextField!
    @IBOutlet var lbl1: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    
        txtemail.becomeFirstResponder()
    
    
    }
    @IBAction func btnlogin(_ sender: UIButton) {
    
    
        let useremail = txtemail.text
        let userpass = txtpass1.text
    
        if ((useremail!.isEmpty) || (userpass!.isEmpty))
    
        {
    
            Displayalert(usermessage: "All Fields Are Required...")
    
        }
    
        // MARK:- Display Id
    
        let useremailstore = UserDefaults.standard.string(forKey: "useremail")
    
        let userpasswordstore = UserDefaults.standard.string(forKey: "userpass")
    
        // MARK:- Login New Page
    
        if useremail != useremailstore
        {
            Displayalert(usermessage: "Enter Valid Email")
    
        }
    
        else if userpass != userpasswordstore
    
        {
    
            Displayalert(usermessage: "Enter Valid Password..")
        }
    
        else
        {
    
            let wel = storyboard?.instantiateViewController(withIdentifier: "welcomeViewController")as! welcomeViewController
    
            self.navigationController?.pushViewController(wel, animated: true)
    
        }
    
    
        if useremailstore == useremail
        {
            if userpasswordstore == userpass
            {
    
                UserDefaults.standard.set(true, forKey: "userlogin")
                UserDefaults.standard.synchronize()
    
                self.dismiss(animated: true, completion: nil)
    
            }
    
        }
    
    }
    
    
    
    @IBAction func btnforgotpass(_ sender: UIButton) {
    
        let pass = storyboard?.instantiateViewController(withIdentifier: "NewPassViewController")as! NewPassViewController
    
    
        self.navigationController?.pushViewController(pass, animated: true)
    
    
    
    }
    
    
    @IBAction func btnnewacc(_ sender: UIButton) {
    
        let login = storyboard?.instantiateViewController(withIdentifier: "RegisterViewController")as! RegisterViewController
    
    
        self.navigationController?.pushViewController(login, animated: true)
    
    }
    
    // MARK:- Alert function
    
    func Displayalert(usermessage:String)
    
    {
    
        let Myalert = UIAlertController(title: "Alert", message: usermessage, preferredStyle: UIAlertControllerStyle.alert)
    
        let Action = UIAlertAction(title: "ok", style: UIAlertActionStyle.default, handler: nil)
    
        Myalert.addAction(Action)
    
        self.present(Myalert, animated: true, completion: nil)
    }
    
    // MARK:- Password set
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    
        if textField == txtpass1
    
        {
            let text = txtpass1.text
            let newLength = (text?.characters.count)! + string.characters.count - range.length
            return newLength <= 8 // Bool
        }
    
        return true
    
    }
    
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    
        txtemail.resignFirstResponder()
        txtpass1.resignFirstResponder()
        return false
    }
    
    override func viewWillAppear(_ animated: Bool) {
    
        txtemail.text = ""
        txtpass1.text = ""
    
    
    }
    
  2. 注册表格

  3. 类RegisterViewController:UIViewController,UITextFieldDelegate,UITextViewDelegate {

    @IBOutlet var txtmail: UITextField!
    @IBOutlet var txtpass: UITextField!
    @IBOutlet var txtrepass: UITextField!
    
    
    var defaults = UserDefaults.standard
    
    var dict : NSMutableDictionary = ["":""]
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        txtmail.becomeFirstResponder()
        return
    
        // Do any additional setup after loading the view.
    }
    
    // MARK:- Register
    
    @IBAction func btnregister(_ sender: UIButton) {
    
        let useremail = txtmail.text
        let userpass = txtpass.text
        let userrepass = txtrepass.text
    
    
    
        if((useremail!.isEmpty) || (userpass!.isEmpty) || (userrepass!.isEmpty))
    
        {
            Displayalert(usermessage: "All Fields Are Required....")
    
        }
    
        if userpass != userrepass
    
        {
    
            Displayalert(usermessage: "Your Re-Password is Not valid....")
            txtrepass.text = ""
    
        }
    
    
    
        let validEmail = isValidEmail(stringValue: txtmail.text!)
    
        if validEmail
        {
    
            print("Email is Valid")
    
        }
        else
        {
            Displayalert(usermessage: "Email Is Not Valid...")
    
        }
    
        //MARK:- Store Data
    
        UserDefaults.standard.set(useremail, forKey: "useremail")
        UserDefaults.standard.set(userpass, forKey: "userpass")
        UserDefaults.standard.synchronize()
    
        //MARK:-  Conformation message
    
        let Myalert = UIAlertController(title: "Alert", message: "Registation is Successful.Thank you...", preferredStyle: UIAlertControllerStyle.alert)
    
        let Action = UIAlertAction(title: "ok", style: UIAlertActionStyle.default) { action in self.performSegue(withIdentifier: "firstview", sender: self)}
    
            Myalert.addAction(Action)
    
            self.present(Myalert, animated: true, completion: nil)
        }
    
    //MARK:-  Alert Call
    
    func Displayalert(usermessage:String)
    {
    
        let Myalert = UIAlertController(title: "Alert", message: usermessage, preferredStyle: UIAlertControllerStyle.alert)
    
        let Action = UIAlertAction(title: "ok", style: UIAlertActionStyle.default, handler: nil)
    
        Myalert.addAction(Action)
    
        self.present(Myalert, animated: true, completion: nil)
    
    }
    
    //MARK:- Email Valid
    
    func isValidEmail(stringValue: String) ->Bool {
        let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"
        let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx)
        return emailTest.evaluate(with: stringValue)
    }
    

    // MARK: - 相同&amp;重新密码

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    
    
        if textField == txtpass
    
        {
        let text = txtpass.text
        let newLength = (text?.characters.count)! + string.characters.count - range.length
        return newLength <= 8 // Bool
        }
    
        if textField == txtrepass
        {
    
            let text = txtrepass.text
            let newLength = (text?.characters.count)! + string.characters.count - range.length
            return newLength <= 8 // Bool
    
        }
    
        return true
    }
    
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    
        txtmail.resignFirstResponder()
        txtpass.resignFirstResponder()
        txtrepass.resignFirstResponder()
        return false
    
    }